본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - 스킬트리

by Jman 2022. 8. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/49993

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

조건

제한시간 : 45분 이내

중요한 포인트를 짚어보자.
1. skill 변수로 받은 선행 스킬 순서를 지키는 지 확인해야한다.
2. 선행 스킬 순서를 다 쓰지 않아도 된다.
3. 선행 스킬 순서 목록에 없는 스킬이 존재한다.

이렇게 생각을 했을 때, 내가 구현한 코드 Flow를 설명하겠다.
1. 먼저 HashMap 에 알파벳 마지막 수인, 26이라는 수를 초기화한다. why? 우선순위 꼴지라 그렇다.
2. 선행 스킬 순서로 HashMap 에서 우선순위를 결정해서 다시 초기화한다. 
3. 이중 for문을 돌면서 문제에서 언급한 내용이 아닐 경우에 최종 retrun 값 수를 차감한다.
4. return 값이 정답니다.

 

import java.util.*;

class Solution {
    final int ALPHA = 26;
    
    public int solution(String skill, String[] skill_trees) {
        int answer = skill_trees.length;
        HashMap<Character, Integer> alpha = new HashMap<>();
        
        for (int i = 0; i < ALPHA; i++) {
            char key = (char)(65 + i);
            alpha.put(key, ALPHA);
        }
        
        for (int i = 0; i < skill.length(); i++) {
            char s = skill.charAt(i);
            alpha.put(s, i);
        }
        
        for (int i = 0; i < skill_trees.length; i++) {
            int order = 0;
            String skillOrder = skill_trees[i];
            for (int j = 0; j < skillOrder.length(); j++) {
                int a = alpha.get(skillOrder.charAt(j));
                
                if(a == ALPHA) continue;
                if(a != order) {
                    answer--;
                    break;
                }    
                order++;
            } 
        }
        return answer;
    }
}