CodingTest

[Programers] 스킬트리(JavaScript)

Daesiker 2021. 1. 27. 22:56
반응형

출처 

https://programmers.co.kr/learn/courses/30/lessons/49993


❓Question

—문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

—제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.

    ⚪ 예를 들어, C → B → D 라면 CBD로 표기합니다

  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.

    ⚪ skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

—입출력 예

skillskill_treesreturn
"CBD"["BACDE" "CBADF" "AECB" "BDA"]2
💡
skill_trees 배열에 유저들이 만든 스킬트리가 담겨져 있다. 선행스킬이 정해져있는 skill 문자열에 포함되지 않은 스킬들은 언제 사용해도 상관이 없지만 선행스킬안에 있는 문자열은 순서대로 배워야 한다.(앞에 있는 스킬을 먼저 배우지 않으면 뒤에 있는 스킬을 배울 수 없다.) 사용이 가능한 스킬트리의 개수를 구하는 문제이다.


❗Solution

function solution(skill, skill_trees) {
    //answer 변수 선언
    let answer = 0;
    //skill_trees의 배열에서 원소를 하나씩 가져온다.
    for (let tmp of skill_trees) {
        //breakPoint가 true일 경우에만 정답 카운트를 늘린다.
        let breakPoint = true
        //skill 문자열을 split함수를 통해 배열로 변환시킨다.
        let skills = skill.split('')
        //가져온 스킬트리 원소를 배열로 변환한뒤 1가지 원소씩 가져온다.
        for (let t of tmp.split('')) {
            //먼저 원소가 선행스킬에 포함되는지 확인
            if (skills.includes(t)) {
                //포함되면 가장 앞에 원소가 맞는지 확인
                if (skills[0] === t) {
                    skills.shift()
                } else {
                    //아니면 정답이 아니므로 breakPoint false로 변환
                    breakPoint = false
                    break
                }
            }
        }
        if (breakPoint === true) { answer += 1}
    }
    return answer;
}

→ 나는 문자열보다 배열이 더 편하기 때문에 split()함수를 통해 배열로 변환을 시켰는데 굳이 배열을 쓰지 않아도 문제를 푸는데 문제가 없다.

→ 반복문을 통해 계산을 할 때 skill의 값이 유실되면 다음 연산에 문제가 있기 때문에 임시변수안에 skill의 값을 담으면서 실행을 해야한다.

→ 배열의 includes 함수를 통해 해당 변수 t가 skills 안에 있는 원소에 있는지 확인을 한뒤 있으면 가장 첫번째 원소가 맞는지 확인한다.

→ 첫번째 원소가 아니면 바로 breakPoint를 false로 바꿔주고 더이상 확인할 필요가 없으므로 break문을 통해 해당 반복문을 빠져나간다.

→breakPoint가 true이면 해당 조건에 다 부합하므로 answer에 1을 추가한다.


반응형