꿀 떨어지는 코딩 양봉장

프로그래머스_Level.2 스킬트리 본문

알고리즘/프로그래머스

프로그래머스_Level.2 스킬트리

nayoon030303 2021. 5. 8. 00:17

1.문제설명

문제: 스킬트리

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

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

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

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

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

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

 

2. 제한 사항

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

 

3.입출력 예

skill skill_trees return
"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

 

📌나의 풀이

 

skill_trees[i][j]가 skill 에 있다면 t에 추가 

for문을 한바퀴 다돌면 temp에 t를 추가 

temp[i]=== skill 0부터 temp[i]의 길이 만큼 이라면 

answer+=1;

function solution(skill, skill_trees) {
    var answer = 0;
    var temp = []; 
    for(let i=0; i<skill_trees.length; i++){
        var t = '';
        for(let j=0; j<skill_trees[i].length; j++){
            if(skill.includes(skill_trees[i][j])){ //skill에 들어있는 것만 
                t+=skill_trees[i][j];  
            }
        }
        temp.push(t);
    }

    for(let i=0; i<temp.length; i++){
       if(temp[i]===skill.slice(0,temp[i].length)){
           answer+=1;
       }
    }
   
    return answer;
}

처음에 includes로 확인하는 방법 외의 replace를 사용하는 방법이 없을까 고민했다. 하지만 내가 알고 있는 replace는 a 값을 특정 값으로 바꿔주는 것이지 a가 아닌 값을 바꿔주는 것은 몰랐다. 또 한번에 skill에 있는  값 외에 값들을 바꿔줘야 한다.

 

다른 사람의 풀이를 보던 도중 정규식을 사용하여 푼 방법을 보았다. 

function solution1(skill, skill_trees) {
    var answer = 0;
    //정규식에 문자열 변수 넣기 객체를 생성해서
    //^의 의미: 부정!
    var regex = new RegExp(`[^${skill}]`, 'g');
    //console.log(regex);
    return skill_trees
        .map((x) => x.replace(regex, ''))
        .filter((x)=>{
            //x의 indexOf가 0이고
            //x===""이라면: 순서 상관없는 스킬들만 선택했을 때
            return skill.indexOf(x) ===0 || x==="";
        }).length;
       
}

 

💡배운점

  • 정규식에서 ^는 부정을 뜻한다.