Coding Test/프로그래머스
[200520] 스킬트리 - Summer/Winter Coding(~2018)(level2)
csmoon1010
2020. 5. 20. 21:22
1. 문제이해
- skill(선행 스킬 순서) : 꼭 순서대로 수행해야하는 스킬 순서
- skill_tress(스킬 트리) : 유저가 스킬을 배울 순서
- skill_tress의 원소들 중 skill의 순서를 따라서 가능한 스킬 트리의 개수를 return
2. 전략
(1) skillMap 해시맵
- HashMap<String, Integer> : <원소, 순서>
- skill에 포함되는 원소인지 확인할 때 유용하기 때문에 : containsKey(s)
(2) skill_trees 확인
- answer : skill_trees의 개수로 초기화
- skillMap.containsKey(s) : skill에 포함되는 원소인지 확인
- current : 현재 확인 중인 skill의 순서(0부터 시작)
- current == skillMap.get(s)라면 current++, 아니라면 answer--
3. 참고사항
- contains관련 함수가 있는 자료구조, 컬렉션
- List 컬렉션 : contains()
- Set 컬렉션 : contains()
- Map 컬렉션 : containsKey(), containsValue()
- 다른 풀이 : ArrayList, Iterator 이용
(1) ArrayList
- Arrays.asList(skill_trees)로 ArrayList 초기화
(2) String
- indexOf(요소) : 요소의 index 확인
(3) Iterator
- ArrayList를 iterator로 바꿔서 loop에 이용
- it.next().replaceAll("[^"+ skill + "]", "") : skill에 있는 요소만 남김
**(2)+(3) : if (skill.indexOf(it.next().replaceAll("[^" + skill + "]", "")) != 0)
skill_trees의 해당 요소들이 skill에 포함되는 지 확인하는 코드
4. 코드
import java.util.*;
class Solution {
public int solution(String skill, String[] skill_trees) {
//hashmap 형성
String[] temp = skill.split("");
HashMap<String, Integer> skillMap = new HashMap<>();
for(int i = 0; i < temp.length; i++){
skillMap.put(temp[i], i);
}
//스킬트리 확인
int current = 0;
int answer = skill_trees.length;
for(String str : skill_trees){
current = 0;
String[] s_temp = str.split("");
for(String s : s_temp){
if(skillMap.containsKey(s)){
if(current == skillMap.get(s)){
current++;
continue;
}
else{
answer--;
break;
}
}
}
}
return answer;
}
}