프로그래머스 (Summer/Winter) | LV.2 스킬트리 - 구현 문풀 (Java)

728x90

⬛ 프로그래머스 (Summer/Winter) | LV.2 스킬트리 - 구현 문풀 (Java)

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

 

프로그래머스

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

programmers.co.kr

문제 설명


💚문제 접근 방식

선행 스킬 순서를 지킨 스킬트리 내의 문자열 개수를 구하는 문제이다.

일단 skill_trees 내부에 선행 스킬에 있는 문자만 이어붙이도록 했다. (나중에 찾아보니 이 부분을 replace로 대체해서 하는 방법도 있었다. 나의 경우는 skill 길이가 26까지니까 그냥 이어붙임)

 

 [주의할 점]
🎈(1) 중간에 약간 헷갈렸던 부분이 있었는데, 예를 들어 skill_trees에 선행 스킬과 아예 관련없는 문자열이 주어진다면 어떻게 처리할 것이냐에 부딪혔다.
“CBD” : [”BACDE”, “BDA”, “QWER”]​

→ 이런 식으로 들어온다면 QWER에는 아예 선행 스킬 관련 문자가 없기 때문에 순서를 지킨 것이나 다름 없어서 처리를 해주어야 한다.

🎈(2) 그리고 “BD”의 경우 CBD 순서를 못지킨 케이스가 된다. B는 C 이후만 되기 때문이다.

→ 이 두 가지 주의점을 모두 포괄하려면 결국 기존 선행스킬을 (해당 문자열만 이어붙인 새 List상의) 문자열 길이만큼 substring으로 잘라서 두 문자열 같은지 비교해주는 방법을 사용하면 됐다.

 

[풀이 정리]

1) skill_trees 상의 각 문자열에 대해서 선행스킬에 존재하는 문자열로만 이어붙여 새로운 List에 담는다.

2) 이제 List를 순회하면서 해당 문자열 길이만큼 선행스킬 문자를 자르고 비교하여 같은 개수만큼 ++ 처리해주면 된다.

→ 이러면 자연스럽게 순서를 지켰는지 확인이 되기 때문

💚 제출 코드

import java.util.*;
class Solution {
    //솔루션 함수 
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        List<String> list = new ArrayList<>();
        
        for(String sk : skill_trees){
            char[] tmp = sk.toCharArray();
            String str = "";

            for(char c : tmp){
                if(skill.contains(String.valueOf(c))){
                    str += c;
                }
            }
            list.add(str);
        }
        for(String x : list) {
            String tmp = skill.substring(0, x.length());
            if(tmp.equals(x)) answer++;
        }
        
        return answer;
    }
}
728x90