프로그래밍-학습기록/코딩테스트

프로그래머스 | python | 스킬트리

leesche 2020. 12. 23. 16:11

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

  • 소요 시간 1시간 30분, 풀다 못하겠어서 다른 사람 풀이 참조함.

  • 무작위로 이뤄진 문자열(A)에 포함된 특정 문자열(B)의 문자들이 그 특정 문자열(B)의 순서를 지키는지 검사하는 문제였다.

    A = "awegd", B = "ag" → A의 a,g가 B의 순서를 지키고 있다.

    A = "gwaed", B = "ag" → A의 a,g가 B의 순서를 지키고 있지 않다.

나의 풀이

from collections import deque

def solution(skill_order, skill_trees):
    answer = len(skill_trees)
    skill_order = skill_order
    for skill_tree in skill_trees:
        skill_order_queue = deque(skill_order)
        for skill in skill_tree:
            if skill in skill_order_queue:
                if skill != skill_order_queue.popleft():
                    answer -= 1
                    break
    return answer

나의 풀이 설명

  • collections 모듈의 deque를 사용했다.
  • 모든 스킬트리가 정답이라고 가정해 초기화한다.
  • 스킬트리를 하나씩 검사한다.
    • 선행 스킬트리가 담긴 큐를 스킬트리를 검사할 때마다 생성한다.
    • 스킬트리 안의 스킬을 하나씩 검사한다.
    • 그 스킬이 선행 스킬트리 큐에 있다면,
      • 선행 스킬트리 큐의 가장 왼쪽 값(popleft)과 비교한다.
        • 비교 결과, 다르다면 비정상이므로 정답 갯수를 하나 감소시킨다.
        • 다음 스킬트리를 검사한다.

새롭게 알게된 것

  • 파이썬에는 for else 문법이 있다.
  • deque를 만들 때 리스트만 deque로 감쌀 수 있는 게 아니라 문자열도 된다. 문서를 보면 iterable 데이터면 다 되는 것 같다. iterable은 무엇이냐? 하면 여기를 보면 된다.