프로그래머스 [스킬 트리] - 구현 Lv.2

JH.P·2022년 7월 26일

구현

  • 문제에서 제시한 조건을 꼼꼼하게 구현해야하는 문제이다.

풀이 전 로직

  • 제시된 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
}
profile
꾸준한 기록

0개의 댓글