스킬트리(프로그래머스)

정승옥(seungok)·2020년 12월 24일
0

프로그래머스

목록 보기
27/40
post-thumbnail

문제설명

  • 선행스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬
  • ex) 선행스킬 순서가 A->B->C이면 B->A나 C->A->B와 같은 경우는 불가능
  • 단, 선행스킬 순서에 없는 다른 스킬은 순서에 상관없이 가능
  • 선행스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees
  • 가능한 스킬트리 개수를 반환

제한조건

  • 스킬은 알파벳 대문자로 표기, 모든 문자열은 알파벳 대문자로 구성
  • 스킬 순서와 스킬트리는 문자열로 표기(ex. C->B->D = "CBD")
  • skill의 길이는 1이상 26이하, 스킬은 중복해 주어지지 않음
  • skill_trees의 길이 1이상 20이하 배열
  • skill_trees의 원소는 스킬을 나타내는 문자열
  • skill_trees의 원소는 길이 2이상 26이하인 문자열, 스킬은 중복해 주어지지 않음

풀이

function solution(skill, skill_trees) {
    let check; // 스킬크리 순서를 지켰는지 체크
    let result = []; // 성공,실패 결과값 저장
    let answer = 0; // 지킨 스킬트리 갯수
    const skillArr = skill.split('').map((step,idx)=>[step,idx]); // skill을 2차원 배열로 변환
    
    // 유저들이 만든 스킬트리들을 돌며 확인
    skill_trees.map((step,idx)=>{
        // 문자열을 배열로 변환
        // 초기 check값은 0(check는 skill의 인덱스와 같음)
        const stepArr = step.split('');
        check = 0;
        stepArr.map((instep,idx)=>{
            // 유저가 찍은 스킬이 skillArr에 포함됐을때
            // 선행스킬 순서를 지켰는지 확인(check값과 인덱스가 같은 경우)
            for(let i=0;i<skillArr.length;i++){
                if(instep === skillArr[i][0]){
                    // 거짓일 경우 'fail', check = -1
                    // 참일 경우 'success', ++check
                    // check = -1 이므로 다음 경우들은 무시
                    if(skillArr[i][1] !== check){
                        result.push('fail');
                        check = -1;
                        break;
                    }else{
                        result.push('success');
                        ++check;
                    }
                }
                // 선행스킬과 상관없는 경우라면 무조건 'success'
                else{
                    if(skill.indexOf(instep)===-1)
                        result.push('success');
                }
            }
        })
        // 결과값에 'fail'이 포함돼있다면 배열 초기화
        if(result.some(res=>res==='fail')){
            result = [];
        }
        // result 배열의 길이가 0보다 크다면 모두 성공한 경우
        if(result.length>0)
            ++answer;
    })
    return answer;
}

체크포인트

  • 선행스킬 순서에 없는 스킬만 구성된 스킬트리 경우도 있음을 까먹지말자~
profile
Front-End Developer 😁

0개의 댓글