728x90
💡 프로그래머스 : 스킬트리
문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어, C → B → D 라면 "CBD"로 표기합니다
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
✍ 문제 풀이
1. 요약
주어진 skill 외에는 전부 삭제, split을 통해 skill과 스킬 트리 순서 비교.
2. 방법 :
- 주어진 skill_trees를 유저가 사용한 스킬 배열(userSkill)로 만든다.
- 각 스킬이 주어진 skill에 해당되는지 contains로 비교한다.
- skill에 속하지 않는 다른 스킬이라면 빈문자열("") 로 지워버린다.
- 주요 스킬 트리만 비교한다.
- 이 userSkill를 다시 전부 join한다. (resultTree. 유저가 주요 스킬만 사용했을 때의 결과이다.)
- skill을 resultTree로 split한다. 이 split된 배열의 length로 사용 가능 여부를 비교한다.
- X ) resultTree에 스킬 트리 외의 부가 스킬만 있을 경우.
사용 가능하다! - 0 ) 만약 resultTree가 skill과 같은 경우.
당연히 사용 가능하다! - 1 ) resultTree와 skill의 스킬 사용 순서가 달라 나누어지지 않는 경우.
사용 불가하다. - 2 ) resultTree로 나누었을 때, result[0]에 따라 결과가 달라진다.
result[0] 이 빈 문자열이라면 앞에서부터 사용한 것이니 사용할 수 있고,
result[0] 에 문자열이 남아있다면 중간부터 스킬을 사용하여 사용할 수 없다.
- X ) resultTree에 스킬 트리 외의 부가 스킬만 있을 경우.
3. 소스 코드
import java.util.*;
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
// 다른 스킬(힐링 등)은 제거
for(int i = 0; i < skill_trees.length; i++){
String[] userSkill = skill_trees[i].split("", -1);
for(int j=0; j <userSkill.length; j++){
if (! skill.contains(userSkill[j])){
userSkill[j] = "";
}
}
//주요 스킬 트리만 비교
String resultTree = String.join("", userSkill);
String[] result = skill.split(resultTree);
if (resultTree.equals("") || result.length == 0){
answer += 1;
} else if(result.length == 2 && result[0].equals("")){
answer += 1;
}
}
return answer;
}
}
✍ 회고
(내용)
728x90
'프로그래밍(Programming) > 알고리즘' 카테고리의 다른 글
💡 프로그래머스 : 신규 아이디 추천 (0) | 2023.05.01 |
---|---|
프로그래머스 : 완주하지 못한 선수 (0) | 2022.11.15 |
다음에 올 숫자 (0) | 2022.11.09 |
프로그래머스 : 옹알이(1) (0) | 2022.11.07 |
[프로그래머스] 평행 (0) | 2022.11.02 |