본문 바로가기

Archived(CSE Programming)/알고리즘(Java)

프로그래머스 - 스킬트리(Java, LV2)

https://programmers.co.kr/learn/courses/30/lessons/49993?language=java

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

풀이

 

  • 주어진 skill_tree String 배열에 대해서 주어진 skill String 만큼 반복문을 돌면서 탐색한다.
  • skill 순서에 따라 검사하는데 선행스킬과 후행스킬의 순서를 고려한다.
  • 1) 선행 스킬을 배우지 않고 후행 스킬을 배운 경우 -> 비정상
  • 2) 선행 스킬을 후행 스킬 뒤에 배운 경우 -> 비정상
class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        
        // skil의 값들을 skill_tree에서 하나씩 위치 찾기 
        // 인덱스 값이 이전 것보다 작아져버리면 불가
        // 또는 안나오다가 갑자기 나온 경우 불가
        for (String skill_tree : skill_trees){
            // 없다 -> -1이 중간에 나오면 안됨
            int p_idx = -2; 
            int idx = -2;
            int ans = 1; // 정답 가능 여부
            
            // 탐색
            char[] skill_arr = skill.toCharArray();
            for(int i=0; i<skill_arr.length; i++ ){
                idx = skill_tree.indexOf(skill_arr[i]);
                
                // 1)번 케이스 >> 안나오다가 나온경우 (비정상)
                if(p_idx == -1 && idx!=-1){
                    ans=0;
                    break;
                }
                    
                // 2)번 케이스 >> 값이 작아졌을 경우 (비정상)
                if(idx != -1 && idx <= p_idx ){
                    ans = 0;
                    break; // 중단
                }
                // 값이 커졌을 경우(정상)
                p_idx =  idx;
            } // end for
            // 정답 체크
            if(ans == 1){
                answer++;
            }
        }
        
        
        return answer;
    }
}