Programmers) 스킬트리
문제
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가
스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서
스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어,
C → B → D라면CBD
로 표기합니다
- 예를 들어,
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
| skill | skill_trees | return |
|---|---|---|
"CBD" | ["BACDE", "CBADF", "AECB", "BDA"] | 2 |
입출력 예 설명
BACDE
: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.CBADF
: 가능한 스킬트리입니다.AECB
: 가능한 스킬트리입니다.BDA
: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.
설명
유저가 셋팅한 스킬 트리가 선행 스킬 순서에 적법한지 체크하는 문제입니다.
저는 선행 스킬 리스트의 인덱스를 기준으로 잡고 이 문제를 해결했는데요, 만약 적법한 스킬 트리라면 다른 스킬들은 다 배제하더라도 선행 스킬 리스트로 입력된 스킬들이 순서대로 언급 되었을 겁니다.
for문을 여러개 씌우는 것은 효율이 많이 떨어질 것 같아 선행 스킬 리스트를 <스킬>:<인덱스>로 구성된 딕셔너리로 미리 만들어 두고,
유저 스킬을 하나하나 쪼개어 딕셔너리 인덱싱 및 이전 인덱스와의 차가 1이 아닐 경우 그냥 탈출 시키도록 코드를 만들었습니다.
만약 적법한 스킬 트리라면 이전 스킬과 이후 스킬의 순서 차가 1씩 나올테니까요.
아래에 제가 푼 코드를 입력해두었습니다. 참고하시면 좋을 것 같습니다.
def solution(skill, skill_trees): answer = 0 s_dict = {val:idx for idx,val in enumerate(list(skill))} for u_skill in skill_trees: chk = -1 flag = 0 for item in u_skill: try: if (s_dict[item] - chk) != 1: flag = 1 break else: chk = s_dict[item] except: continue if flag == 0: answer += 1 return answer
더 효율적이고 획기적인 방법이 있다면 언제든지 댓글 달아주세요~!
댓글
댓글 쓰기