- 내 방법 풀이
- 처음에 인덱스를 비교하여 풀 생각을 하였다. 필수 스킬트리를 따라 인덱스가 주어지므로, skill_trees를 순회하며 각 스킬의 인덱스와 skill의 인덱스를 비교하려고 했지만 앞선 스킬중에 무관한 스킬이 포함되어 있을 때 답을 낼 수가 없기 때문에 다른 적용을 찾아야 했다.
- 따라서 replaceAll과 정규식을 활용하여 필수 스킬 외에 상관없는 스킬을 제거하고, 남은 skill_tree와 skill의 인덱스를 비교하며, 해당 스킬이 skill의 인덱스와 같지 않다면, 제대로 스킬트리를 배우지 못한 것이므로 answer를 증가시키지 않았다.
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
for (String skill_tree : skill_trees) {
skill_tree = skill_tree.replaceAll("[^"+skill+"]", ""); // 필수 스킬 외에 상관없는 스킬 제거
boolean canLearn = true;
for (int j = 0; j < skill_tree.length(); j++) {
char skillNum = skill_tree.charAt(j);
if (skill.indexOf(skillNum) != j) { // 해당 스킬의 배운 순서가 skill의 인덱스랑 같지 않다면 false.
canLearn = false;
break;
}
}
if (canLearn) answer++;
}
return answer;
}
}
- 다른 사람 방법 풀이
- 리스트를 선언하고 순회하귀 위한 Iterator를 사용했다. 이는 for-each 반복문이 할 수 없는 값을 순회하는 동시에 수정하는 일을 하기 위해서, 사용한 듯 하다.
- Iterator를 통해 다음 값이 있다면 읽어와서 skill에 없는 skill_tree 내 요소를 삭제한 뒤 데이터를 반환한다. 그 후 남은 스킬의 인덱스가 skill에서 0이 아니라면 Iterator에서 제거하고 남은 요소들을 확인하여 size로 answer에 담아준 뒤 리턴.
- Iterator와 정규식으로 인해서 이해하는 데 시간이 걸렸던 코드. 그러나 나의 코드보다 훨씬 간결했다.
import java.util.*;
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
ArrayList<String> skillTrees = new ArrayList<String>(Arrays.asList(skill_trees));
//ArrayList<String> skillTrees = new ArrayList<String>();
Iterator<String> it = skillTrees.iterator();
while (it.hasNext()) {
if (skill.indexOf(it.next().replaceAll("[^" + skill + "]", "")) != 0) {
it.remove();
}
}
answer = skillTrees.size();
return answer;
}
}