본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 스킬트리

- 내 방법 풀이

  • 처음에 인덱스를 비교하여 풀 생각을 하였다. 필수 스킬트리를 따라 인덱스가 주어지므로, skill_trees를 순회하며 각 스킬의 인덱스와 skill의 인덱스를 비교하려고 했지만 앞선 스킬중에 무관한 스킬이 포함되어 있을 때 답을 낼 수가 없기 때문에 다른 적용을 찾아야 했다.
  • 따라서 replaceAll과 정규식을 활용하여 필수 스킬 외에 상관없는 스킬을 제거하고, 남은 skill_tree와 skill의 인덱스를 비교하며, 해당 스킬이 skill의 인덱스와 같지 않다면, 제대로 스킬트리를 배우지 못한 것이므로 answer를 증가시키지 않았다.
class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        for (String skill_tree : skill_trees) {
            skill_tree = skill_tree.replaceAll("[^"+skill+"]", ""); // 필수 스킬 외에 상관없는 스킬 제거
            boolean canLearn = true;
            for (int j = 0; j < skill_tree.length(); j++) {
                char skillNum = skill_tree.charAt(j);
                if (skill.indexOf(skillNum) != j) { // 해당 스킬의 배운 순서가 skill의 인덱스랑 같지 않다면 false.
                    canLearn = false;
                    break;
                }
            }
            if (canLearn) answer++;
        }
        return answer;
    }
}

 

- 다른 사람 방법 풀이

  • 리스트를 선언하고 순회하귀 위한 Iterator를 사용했다. 이는 for-each 반복문이 할 수 없는 값을 순회하는 동시에 수정하는 일을 하기 위해서, 사용한 듯 하다.
  • Iterator를 통해 다음 값이 있다면 읽어와서 skill에 없는 skill_tree 내 요소를 삭제한 뒤 데이터를 반환한다. 그 후 남은 스킬의 인덱스가 skill에서 0이 아니라면 Iterator에서 제거하고 남은 요소들을 확인하여 size로 answer에 담아준 뒤 리턴. 
  • Iterator와 정규식으로 인해서 이해하는 데 시간이 걸렸던 코드. 그러나 나의 코드보다 훨씬 간결했다.
import java.util.*;

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        ArrayList<String> skillTrees = new ArrayList<String>(Arrays.asList(skill_trees));
        //ArrayList<String> skillTrees = new ArrayList<String>();
        Iterator<String> it = skillTrees.iterator();

        while (it.hasNext()) {
            if (skill.indexOf(it.next().replaceAll("[^" + skill + "]", "")) != 0) {
                it.remove();
            }
        }
        answer = skillTrees.size();
        return answer;
    }
}