본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 스킬트리

by StelthPark 2022. 5. 1.

처리조건

풀이

skill을 split하여 선행 스킬 순서를하나하나 쪼개어 배열로 만들어준다. 또한 skill_trees도 for문을 돌며 하나의 스킬트리 원소마다 올바른 순서인지 확인할 것이기 때문에 이것도 한 스킬트리원소를 순회할 때 마다 split으로 쪼개줄것이다. 배열의 교집합을 사용하면 편할 것 같다고 생각했다.

 

또한 조건도 잘봐야한다. 스킬은 중복해서 주어지지 않으며 선행스킬순서가 CBD라면 스킬트리요소는 BD로 C가없어도 순서대로 이어지니 문제없는 스킬트리요소이다.

 

스킬이 CBD이고 스킬트리요소가 BACDE일때 교집합을 스킬트리요소 기준으로 구하면 스킬트리요소에서 선행스킬 순서에 상관없는 요소들이 제거가 된다. 즉 BCD만 남게 될 것이고 이를 인덱스 별로 CBD와 비교해서 만약 하나라도 다르게 되면 카운터를 올려주지 않는 방법으로 skill_trees를 for문 돌며 모든 스킬트리요소를 순회하면 된다.

 

난이도2 치고는 굉장히 쉬웠다. 교집합을 구하는 로직에서 skill_trees를 기준으로 구하면 선행스킬순서에 상관없는 요소들이 제거되며 자신의 원본스킬순서는 유지된다는 것을 이용했다. 또한 스킬트리를 기준으로 구하는 이유는 선행스킬순서보다 스킬트리요소가 더적을 수 있기 때문이다.

 

function solution(skill, skill_trees) {
  let skillArr = skill.split("");
  let answer = 0;

  for (let idx = 0; idx < skill_trees.length; idx++) {
    let skill_treesArr = skill_trees[idx].split("");
    let difference = skill_treesArr.filter((x) => skillArr.includes(x));
    answer++; //일단 해당 스킬트리요소 +1
    for (let i = 0; i < difference.length; i++) {
      if (difference[i] !== skillArr[i]) {
        answer--; //인덱스별 하나라도 같지 않으면 다시 해당 스킬트리요소 -1
        break;
      }
    }
  }
  return answer;
}

 

 

댓글