문제
https://school.programmers.co.kr/learn/courses/30/lessons/49993
내 풀이
function solution(skill, skill_trees) {
var answer = 0;
for(let skill_tree of skill_trees){
let stack = [...skill];
let isPossible = true;
for(let v of skill_tree){
if(stack.includes(v)){
if(stack[0] === v) stack.shift();
else{
isPossible = false;
break;
}
}
}
if(isPossible) answer++;
}
return answer;
}
스킬트리를 스택에 복사한다. 이 스택은 선행 스킬의 순서를 지키는지 확인하기 위한 것이다. 그리고 스킬트리를 순회하면서 해당 스킬이 선행 스킬 이후에 배우는 스킬인지 아닌지 확인한다. 다시 말해, 스택 bottom 값과 동일한지 아닌지를 확인한다.
- 스택 bottom 값과 지금 들어온 스킬 v가 같다면, 선행 스킬 이후에 배우는 스킬이다. 따라서 스택 bottom 값을 제거한다.
- 스택 bottom 값과 지금 들어온 스킬 v가 다르다면, 선행 스킬을 지키지 않은 것이다. 따라서 불가능한 스택이므로 isPossible에 false를 할당하고 스킬트리 순회를 break한다.