처음에는 HashMap을 이용해서 index 차이 두고 문제를 풀려고 했으나 코드가 너무 복잡해지고 지저분해져서 빠르게 다른 규칙을 찾았다.
제일먼저 유저들이 만든 스킬트리(skill_trees)에서 skill에 포함되지 않는 문자들은 모두 제외시키고 남은 문자열이 skill 문자열에 포함되는지 확인한다. (이것만 하면 결과가 나오는 줄 알았다..ㅠ)
skill 문자열이 "CBD" 인데 "BD"가 생기는 경우가 존재한다. 이말은 즉, B 전에 C가 선행되어야하는데 위에 말한 것처럼 구현하면 걸러지지 못하는 것이다. 그래서 찾은 것이 String 의 indexOf() 함수이다. indexOf() 함수는 찾는 문자열이 몇번째 위치에 있는지 반환해주는 것인데, 이것이 0이 나와야 올바른 결과인 것이다.
import java.util.*;
class Solution {
public int count;
public ArrayList<Character> skills = new ArrayList<Character>();
public int solution(String skill, String[] skill_trees) {
// 1. skill 문자를 제외한 나머지 삭제
// 2. skill 문자열과 같은지 확인
// 선행 스킬
for(int i=0; i<skill.length(); i++) {
skills.add(skill.charAt(i));
}
StringBuilder sb = new StringBuilder();
// 스킬트리 하나씩 확인
for(int i=0; i<skill_trees.length; i++) {
String str = skill_trees[i];
// 하나하나 skills에 포함되어 있는지
for(int j=0; j<str.length(); j++) {
char c = str.charAt(j);
if(skills.contains(c)) {
sb.append(c);
}
}
// indexOf는 문자열(skill)에 해당 문자열이 포함되어 있으면 위치를 반환
if(skill.indexOf(sb.toString()) == 0) {
count += 1;
}
sb.delete(0, sb.length());
}
return count;
}
}