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

 

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

 

programmers.co.kr

 


REVIEW

  • deque의 popleft()를 사용하여 pop(0)보다 더 효율적으로 앞선부터 element를 추출하였다. 
  • 순서에 따라야 하는 스킬만 tree에 남게하였기 때문에 skill과 tree에서 차례대로 추출된 element는 동일하여야 한다. 동일하지 않을 경우 순서가 skill과 tree의 스킬 순서가 다르다고 해석할 수 있다. 
  • popleft( )로 skill과 tree의 element를 차례대로 추출하여 비교하였다. 하지만 skill에 더 이상 남은 스킬이 없는데 tree에는 있는 경우, 또는 반대로 tree에 더 이상 남은 스킬이 없는데 skill에는 있는 경우가 있을 수 있기 때문에 skill과 tree 둘다 element가 있을 경우에만 추출-비교 작업을 수행하도록 하였다. 
  • 비교 과정을 status에 기록하였다. 
from collections import deque

def solution(skill, skill_trees):
    answer = 0

    for tree in skill_trees:
        # skill에 있는 기술만 추출
        tree = deque([x for x in tree if x in skill])
        skill2 = deque(skill)

        status = True
        # skill과 tree에 element가 존재할 때만 반복하여 pop from empty list 에러 방지
        while skill2 and tree:
            if skill2.popleft() != tree.popleft():
                status = False
                break
		# element가 불일치한 적이 없고 tree에만 잔여 스킬이 있는 것이 아니라면 count
        if status and len(tree) == 0: answer += 1


    return answer

다시 코드를 리뷰하니 skill에 남은 스킬이 없는데 tree에는 스킬이 아직 남아있어서 pop from empty list 에러가 발생하지 않았을 것이라는 점을 깨닳았다.

tree에는 중복되는 스킬이 없다보니, skill에 포함된 스킬만 남아있는 tree의 길이는 항상 skill보다 짧거나 동일하기 때문이다. 

따라서 어차피 while문이 끝났을 때는 tree가 empty할 테니 len(tree) == 0을 count 조건에 지정할 필요가 없었다

 

이를 반영하여 개선한 코드는 다음과 같다:

from collections import deque

def solution(skill, skill_trees):
    answer = 0

    for tree in skill_trees:
        tree = deque([x for x in tree if x in skill])
        skill2 = deque(skill)

        status = True
        while tree:
            if skill2.popleft() != tree.popleft():
                status = False
                break

        if status: answer += 1


    return answer

+ Recent posts

티스토리 친구하기