구현
- 문제에서 제시한 조건을 꼼꼼하게 구현해야하는 문제이다.
풀이 전 로직
- 제시된 skill_trees 배열을 차례대로 순회한다.
- skill_tree 내부에서 스킬 트리 하나씩 요소를 순회하며 검사해야하기 때문에, 내부에서 한차례 순회를 더 시행한다.
- 이때 문자열 형태인 스킬트리를 split 함수를 이용하여 배열로 변환한 뒤, 차례대로 순회하며 제시된 정석 스킬트리(skill)과 일치하는 문자열이 존재하는지 검사한다.
- 만약 존재하면 해당 스킬 트리를 순회하기 전에 생성한 빈 배열에 일치하는 문자열을 차례대로 push한다.
- 해당 스킬트리의 한 차례 순회가 종료되면, 문자열을 담은 배열을 join 함수로 문자열로 변환한 뒤, 해당 문자열이 정석 스킬트리(skill)의 부분 문자열인지 includes 함수를 이용하여 검사한다.
- 이때, 첫 글자가 정석 스킬트리의 첫 글자로 시작하는지도 같이 검사한다. 첫 글자가 정석 스킬트리의 첫 글자로 시작하고, 정석 스킬트리의 부분 문자열이면 해당 문자열은 정석 스킬트리를 준수하고 있다는 말이 된다.
- 또한 문자열을 담은 배열이 빈 배열인지도 검사한다. 빈 배열이라면, 정석 스킬트리와는 관련이 없는 스킬트리이므로 이 또한 가능한 케이스이다.
코드
function solution(skill, skill_trees) {
let answer = 0
for(let i = 0; i < skill_trees.length; i++) {
const skillTree = skill_trees[i].split('') // i 번째 스킬 트리 순회 차례
const arr = [] // i 번째 스킬 트리 검사를 위한 빈 배열 생성
for(let j = 0; j < skillTree.length; j++) {
skill.split('').forEach(item => {
if(skillTree[j] === item) {
arr.push(item)
}
})
}
if(arr.join('')[0] === skill[0] && skill.includes(arr.join(''))) { // 만약 순서가 정석 스킬 트리와 정확하게 일치하면 true
answer += 1
}
else if(arr.length === 0) { // 만약 스킬 트리와 전혀 관련없는 것만 배웠다면 true
answer += 1
}
}
return answer
}