선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
function solution(skill, skill_trees) {
let answer = 0,
filtered = [];
// skill에 해당되는 스킬을 찾아서 temp에 넣어줌
for (let i = 0; i < skill_trees.length; i++) {
let temp = []; // temp : skill에 해당되는 문자 저장용
for (let j = 0; j < skill_trees[i].length; j++) {
for (let k = 0; k < skill.length; k++) {
if (skill_trees[i][j] === skill[k]) {
temp.push(skill_trees[i][j]);
}
}
}
filtered.push(temp);
}
console.log(filtered);
// 추출한 문자열과 skill 체크
for (let i = 0; i < filtered.length; i++) {
if (filtered[i].length === 0) { // skill에 해당되는 스킬이 없는 경우
answer++;
}
for (let j = 0; j < filtered[i].length; j++) {
if (skill[j] !== filtered[i][j]) {
break;
}
if (j === filtered[i].length - 1) { // skill과 filtered 순서가 일치
answer++;
}
}
}
console.log(answer);
return answer;
}
skill_trees에서 skill에 해당되는 스킬을 찾아낼 때 3중 for문을 써서 효율이 안 좋을 것 같지만.. 이 방법밖에 생각이 안 나서 어쩔 수 없었다.
문제 접근 방식은 다음과 같다.
풀면서 막혔던 부분은 크게 두 군데가 있었는데,
'C', ['CXF', 'ASF', 'BDF', 'CEFD']
와 같은 경우이다.