카테고리 없음

[프로그래머스] Stack/Queue - 프린터

코드냠냠꿀꺽 2021. 9. 24. 00:21

문제

문제설명

접근 방식

1. 대기목록에 들어가있는 순서대로 앞에서 부터 인쇄의 여부를 경정하기 때문에 queue를 사용

2. 요청한 문서의 위치 값을 -1 씩 하고, index -1이 되었을 때 해당 문서의 중요도가 나머지 문서들 보다 높은지 확인

3-1. 높으면 문서가 인쇄 될 때마다 count했던 값을 반환

3-2. 낮으면 queue에 다시 append

from collections import deque

def solution(priorities, location):
    count = 0
    priorities = deque(priorities)
    while True:
        value = priorities.popleft()
        location -= 1
        if len(priorities) == 0:
            default = value
        else:
            default = max(priorities)
        if default <= value:
            count += 1
            if location == -1:
                return count
        else:
            priorities.append(value)
            if location == -1:
                location = len(priorities) - 1

생각했던 접근 방식대로 구현하고 코드도 정리했지만 가독성이 좋지 않았다ㅠㅠ

다른 분의 코드를 참고하면서, python의 any() 함수와 요청한 문서 location을 추적 할 수 있는 더 좋은 방법을 알게 되었다. 

def solution(priorities, location):
    queue =  [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    while True:
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else:
            answer += 1
            if cur[0] == location:
                return answer

위에 코드가 참고한 코드이다! 

나의 코드와 차이점은 

1. deque대신 list 사용

원래 알고 있기론 list.pop(0)을 하게되면 재할당을 해야하는 경우가 있어서 queue를 사용하는 경우에는 deque.popleft()를 사용하는 것이 더 좋다고 알고 있었다. 하지만 다른분의 코드를 deque로 변환해서 테스트 시간을 측정 해본 결과 오히려 더 늦어지는 경우가 발생했다. -> 이유는 추후 다시 조사!!

2. max 함수 대신 any() 함수를 사용

any() 함수는 이번에 처음 보게 되었는데, iterable의 element 중 하나라도 true 라면 true를 반환하고 true가 하나도 없다면 false를 반환한다고 한다. 또한 iterable이 empty여도 false를 반환한다. 내가 작성한 코드의 경우 queue가 empty이면 max 함수에서 오류가 나기 때문에 if 문으로 처리를 해주어야 했다. max가 아닌 any()의 경우 empty여도 오류가 나지 않기 때문에 좀 더 편리하게 사용할 수 있을 것 같다. 

3. location 추적 방식

내가 작성한 코드에서는 매개 변수로 넘어온 location을 계속 -1이 될 때까지 감소시켰다가 다시 queue의 길이만큼 저장하는 방식을 사용하였다. 다른 분이 작성하신 코드를 보면 enumerate로 index값을 같이 저장해주어서 따로 location 값을 관리하지 않았다. enumerate 방식이 location 값을 신경 쓰지 않고 비교만 하면 되기 때문에 훨씬 간편하다고 느꼈다. 

 

지금보다 더 다양한 파이썬 내장 함수들의 작동 원리를 이해하고 적용시켜 효율성과 가독성이 높은 코드를 작성하고 싶다!!아자아자ㅎㅎ