Programmers - 스킬트리

Doodream·2021년 3월 23일
0

코딩테스트

목록 보기
8/22
post-thumbnail

💻 스킬트리


❓ 문제

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

✔️ 코드

function solution(skill, skill_trees) {
    var answer = 0;
    var skillArr = skill.split('');

    skill_trees.map(x => {
        var isIncludesAny = false;
        for (let i = 0; i < skillArr.length; i++) {
            var isIncludes = x.indexOf(skillArr[i]);
            if (isIncludes !== -1) {
                isIncludesAny = true;
                if (i === 0) {
                    continue;
                } else {
                    var isIncludesPreskill = x.indexOf(skillArr[i - 1]);
                    if (isIncludesPreskill === -1) {
                        return;
                    }
                    if (isIncludesPreskill > isIncludes) {
                        return;
                    }
                }
            }
        }
        if (isIncludesAny === false) {
            answer++;
            return
        }
        answer++;
    })
    return answer;
}

let skill = "CBDK";
let skill_trees = ["CB", "CXYB", "BD", "AECD", "ABC", "AEX", "CDB", "CBKD", "IJCB", "LMDK"];

console.log(solution(skill, skill_trees));

❗️풀이과정

answer++ 되는 조건을 이야기해보자
1. 스킬요소에 아얘 없는 스킬요소들만 있는 스킬트리인 경우
2. 스킬요소에 있으나 스킬의 가장 앞 요소가 있으며 순서대로 배운 경우, 다만 스킬요소에 없는 스킬은 상관하지 않는다.

  • 여기서 스킬요소의 두번째부터 바로 앞 스킬요소가 있어야만 스킬을 배울수 있다는 것을 체크한다.

접근을 방식은 스킬트리에 있는 스킬을 하나씩 꺼내서 조건에 부합한지 체크한다.

  1. 스킬트리의 요소를 x라고 하자 x에 스킬요소가 있는지 확인한다.

    • 어떠한 요소라도 있다면 includesAnytrue로 변환 : 조건 1을 확인
  2. 만약 스킬요소의 가장 앞부분이 있다면 다음 스킬확인

  3. 다시 두번째부터 스킬요소가 있는지 확인할 때는 선행스킬이 있는지 확인한다.

    • 없다면 다음 스킬트리
    • 있다면 선행스킬이 지금스킬보다 늦게 배운다면 다음 스킬트리

모두 통과된 것들은 조건을 모두 만족한 것이므로 answer++;

배운점

  • 배열의 복사는 참조 복사를 하지말고 깊은 복사를 위해서 slice()복사 혹은 var arrCopy = JSON.parse(JSON.stringify(arr))

  • 배열의 비교또한 위와 같이 JSON.stringify(arr) === JSON.stringify(arr2) 한다. 단점은 객체를 JSON형태로 바꾸는 것이기에 getter, setter가 있는 객체를 주의한다.

  • map()함수는 배열을 차례대로 훑기 때문에 breakcontinue같은 for문에서 돌아가는 명령문은 통하지 않는다. 대신 return 같은 것을 쓰자.

profile
일상을 기록하는 삶을 사는 개발자 ✒️ #front_end 💻

0개의 댓글