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



1. 문제

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

2. 풀이 방법

  • 알파벳 순서를 배열에 기록합니다.
  • skill tree를 하나하나 살펴보면서
    • 배열에 기록된 단어가 아니면(스킬 순서가 없으면), 건너 뜁니다.
    • 배열에 기록된 단어이면서
      • 아직 사용한 스킬이 없으면, 0번째 스킬로 갱신합니다.
      • 0번째 스킬이 아닌 경우, 이전에 사용한 스킬과 값이 1 차이가 나는지 확인합니다.

3. 소스코드

3.1. 내가 푼 소스코드

def solution(skill, skill_trees):
    # 알파벳 순서 기록
    skill_order = [-1] * 26
    for i, x in enumerate(skill):
        skill_order[ord(x) - ord('A')] = i
        
    answer = 0
    # 사용한 넘버보다 최신이면 x
    for each_tree in skill_trees:
        top_order = -1
        is_answer = True
        for i, x in enumerate(each_tree):
            # 순서 상관 없는 스킬은 건너 뜀
            if skill_order[ord(x) - ord('A')] == -1:
                continue
            
            # 순서가 상관 있는 경우, 아직 사용한 스킬이 없으면 0번째 skill인지 확인 후 갱신
            if top_order == -1 :
                if skill_order[ord(x) - ord('A')] != 0:
                    is_answer = False
                    break
                top_order = skill_order[ord(x) - ord('A')]
                continue
                
            # 다음 스킬은 반드시 이전에 쓴 스킬 다음이어야 하기 때문에, 순서가 1 차이나는지 확인  
            if skill_order[ord(x) - ord('A')] - top_order == 1:
                top_order = skill_order[ord(x) - ord('A')]
                print(x)
            else:
                is_answer = False
                break
            
        if i == len(each_tree) - 1 and is_answer:
            print(each_tree, i)
            answer += 1
            
    return answer

3.2. 숏코딩 by programmers

  • for-else 문을 사용하여 문제를 보다 쉽게 해결하였습니다.
  • pop(0)을 사용하여 가장 좌측에 있는 스킬인지 확인하였습니다.
def solution(skill, skill_trees):
    answer = 0

    for skills in skill_trees:
        skill_list = list(skill)

        for s in skills:
            if s in skill:
                if s != skill_list.pop(0):
                    break
        else:
            answer += 1

    return answer