Coding - Algo/python

[프로그래머스] 프린터 (python 파이썬)

jainn 2021. 6. 17. 17:55
728x90

문제

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

풀이 및 소스코드

enumerate 함수를 사용해서 (중요도, 리스트의 인덱스)를 deque에 넣어줍니다.

enumerate 함수는 반복문을 사용할 때, 리스트의 인덱스가 필요한 경우가 간혹 있는데, 리스트의 원소에 순서값을 부여해주는 함수 입니다.

priorities = [2, 1, 4, 5]

d = deque([(v, i) for i, v in enumerate(priorities)])

print(d)
>> deque([(2, 0), (1, 1), (4, 2), (5, 3)])

위와 같이 각 원소와 인덱스가 deque에 들어간 걸 볼 수 있습니다.

이것을 이용해서 프린터를 풀면 간단히 풀 수 있습니다.

 

중요도가 제일 높은 원소는 뽑고, 높지 않다면 큐의 맨 끝자리에 다시 추가해줍니다.

만약 중요도가 제일 높고, 몇 번째로 인쇄되는지 알고싶은 위치의 원소가 뽑히게 된다면 break 후 순서를 출력하면 됩니다.

from collections import deque
def solution(priorities, location):
    answer = 0
    d = deque([(v,i) for i,v in enumerate(priorities)])
    
    while d:
        nowlist = d.popleft()
        if len(d)!=0:
        # 이걸 안하게 된다면 2번 14번(?) 런타임 오류 발생
        # 중요도가 제일 낮은 원소가 언제 출력되는지 알길 원하는 원소라면, 다 뽑히고 마지막 비교 시 d가 비어있기 때문에 max(d)를 구할 수 없습니다. 
            if nowlist[0] < max(d)[0]:
                d.append(nowlist)
            else:
                answer += 1
                if nowlist[1] == location:
                    break
        else:
            answer += 1
            if nowlist[1] == location:
                break
    return answer

 

반응형