라떼는말이야

[프로그래머스 lv2] 프린터 (파이썬) 본문

알고리즘/코딩 테스트

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

MangBaam 2021. 6. 23. 01:54
반응형

문제 설명

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

입출력 예

입출력 예

입출력 예 설명

예제 #1

문제에 나온 예와 같습니다.

예제 #2

6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.

 


 

 

 

나의 풀이

from collections import deque

def solution(priorities, location):
    idxs = [i for i in range(len(priorities))]
    pages = [(i, p) for i, p in zip(idxs, priorities)]
    
    queue = deque(pages)
    
    orders = [] # 인쇄 순서
    while len(queue):
        page = queue.popleft()
        if page[1] == max(priorities):
            orders.append(page[0])     # orders에 인덱스 추가
            priorities.remove(max(priorities))
        else:
            queue.append(page)
            
    return orders.index(location) + 1

이 문제를 보고 큐를 사용해야겠다는 생각이 들었다.

파이썬에서 큐를 사용할 때는 collections 라이브러리의 deque를 사용한다.

'덱' 이라고 읽는데 사실 deque은 queue와 stack을 합쳐놓은 개념의 자료구조이다.

 

deque는 스택과 같이(파이썬에서 리스트) append(), pop() 함수로 deque의 마지막에 데이터를 삽입, 삭제하고,

appendleft() popleft() 로 deque의 앞 쪽에 데이터를 삽입, 삭제할 수 있다.

 

우선 (인덱스, 우선순위) 를 튜플로 만들기 위해 인덱스가 설정된 idxs 리스트와 우선순위가 설정된 priorities 리스트를 zip으로 묶어서 튜플로 만들어 pages에 저장했다.

 

그리고 queue = deque(pages)로 리스트인 pages를 deque로 만들어 queue에 저장했다.

 

인쇄 순서대로 저장하는 리스트인 orders도 선언했다.

 

우선 큐에서 맨 앞쪽의 문서를 꺼내서 우선순위가 가장 큰 문서인지 확인한 후

우선순위가 가장 큰 문서라면 : orders 리스트에 문서의 인덱스를 추가하고 우선순위 목록에서 가장 큰 우선순위를 지운다.

우선순위가 가장 큰 문서가 아니라면 : 다시 큐의 맨 뒷쪽에 문서를 삽입한다.

 

위 과정을 큐에 남은 문서가 없을 때까지 반복한다.

 

이 과정이 완료되면 orders 리스트에는 출력 순서대로 문서의 인덱스가 저장되어 있을 것이다.

 

orders.index() 함수로 몇 번째로 출력된 문서인지 확인 후 return 해준다.

 

테스트 결과

반응형
Comments