[Summer/Winter Coding(~2018)] 스킬트리
2022. 3. 29. 16:42ㆍPS/Programmers
[문제 접근법]
- Topology Sort 개념을 적용하여 해당 스킬의 선행스킬이 먼저 배웠는지 확인하였다. 자세한건 아래 소스코드를 보면서 설명하겟습니다.
토폴로지 정렬이 궁금하다면? 🙄😲
https://m.blog.naver.com/ndb796/221236874984
https://programmers.co.kr/learn/courses/30/lessons/49993
[구현 1]
1. 선행스킬 그래프와 후행스킬 그래프를 만든다.
2. 스킬트리를 하나씩 루프를 돌아 해당 스킬의 후행 스킬 찾는다.
2-1. 후행 스킬이 존재한다면 후행 스킬의 선행 스킬을 제거한다.
2-2. 후행 스킬이 존재하지 않는다면 어떠한 연산도 하지 않는다.
3. 만약 해당 스킬의 선행 스킬이 존재한다면 그 스킬트리는 가능하지 않아서 false를 리턴한다.
4. 스킬트리 루피를 다돌아서 끝나면 해당 스킬트리는 가능하다는 의미로 true를 리턴한다.
package com.codingtest.programmers.level2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//Summer/Winter Coding(~2018) > 스킬트리
public class SkillTree {
public List<Map<String, String>> makePriorSkillMap(String skill) {
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> preSkill = new HashMap<>(); //특정 스킬의 선행스킬을 담는다.
Map<String, String> postSKill = new HashMap<>(); //특정 스킬의 후위스킬을 담는다.
char[] skillChars = skill.toCharArray();
for (int i = 1; i < skillChars.length; i++) {
preSkill.put(String.valueOf(skillChars[i]), String.valueOf(skillChars[i - 1]));
postSKill.put(String.valueOf(skillChars[i - 1]), String.valueOf(skillChars[i]));
}
list.add(preSkill);
list.add(postSKill);
return list;
}
//스킬트리가 가능한지 확인
public boolean isPossibleSkillTree(Map<String, String> preSkillMap, Map<String, String> postSKillMap, String skillTree) {
Map<String, String> preSkill = new HashMap<>(preSkillMap); //선행 스킬
Map<String, String> postSkill = new HashMap<>(postSKillMap); //후위 스킬
for (char c : skillTree.toCharArray()) {
String skill = String.valueOf(c);
//선행 스킬이 있으면
if (!preSkill.getOrDefault(skill, "0").equals("0"))
return false;
else {
//해당 스킬의 다음 스킬을 찾는다
String next = postSkill.getOrDefault(skill, "0");
if (!next.equals("0")) //해당 스킬의 다음 스킬이 있으면
preSkill.put(next, "0");
}
}
return true;
}
public int solution(String skill, String[] skill_trees) {
int answer = 0;
Map<String, String> preSkillMap = makePriorSkillMap(skill).get(0); //선행 스킬
Map<String, String> postSKillMap = makePriorSkillMap(skill).get(1); //후위 스킬
for (int i = 0; i < skill_trees.length; i++) {
if (isPossibleSkillTree(preSkillMap, postSKillMap, skill_trees[i]))
answer++;
}
return answer;
}
public static void main(String[] args) {
String skill = "CBD";
String[] skillTrees = {"BACDE", "CBADF", "AECB", "BDA"};
SkillTree st = new SkillTree();
int solution = st.solution(skill, skillTrees);
System.out.println("solution = " + solution);
}
}
반응형
'PS > Programmers' 카테고리의 다른 글
네트워크 (0) | 2022.03.30 |
---|---|
[KAKAO] 오픈채팅방 (0) | 2022.03.30 |
더 맵게 (0) | 2022.03.24 |
[2021 Dev-Matching] 다단계 칫솔 판매 (0) | 2022.03.23 |
[2021 Dev-Matching] 행렬 테두리 회전하기 (0) | 2022.03.23 |