[BOJ](python) 프린터 큐

berry ·2022년 4월 6일
0

Algorithm

목록 보기
67/77
post-thumbnail

🧩 문제

프린터 큐


🧩 문제 해석

첫 줄에 문서의 개수 N, 몇 번째로 인쇄되는지 궁금한 문서 M,
두 번째 줄에 문서의 중요도가 나열되어있다.

테스트 케이스 3번에서
N이 6이고 M이 0이면 1이 몇 번째로 인쇄되는지 궁금한 문서인데
왜 2가 아니고 5인지 한참 생각했다.

문제 중
2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.
이 제한사항 때문이었다.

중요도가 같을 때의 테스트 케이스를 보면,

1 1 9 1 1 1

에서 1의 중요도가 가장 높은 문서가 아니기 때문에

1 9 1 1 1 1
9 1 1 1 1 1 -> 9 출력
1 1 1 1 1 -> 1 출력
1 1 1 1 -> 1 출력
1 1 1 -> 1 출력
1 1 -> 1 출력

의 순서를 거치고 5 번째에 출력이 되는 것이다.

📌 문제 해결 방식

  1. 높은 중요도의 문서를 우선 순위로 출력하고
  2. 중요도가 같으면 Queue(FIFO)로 출력

🏁 내 풀이

# BOJ _ 1966 프린터 큐 

from collections import deque
for i in range(int(input())):
    N,M = map(int, input().split())
    case = deque(list(map(int, input().split())))
    idx_case = deque(list(range(N))) # 중복 숫자가 나올 수도 있으므로 idx로 구분해주기 위함
    cnt = 0

    while case:
        if case[0] == max(case): # 중요도가 가장 높은 서류가 case의 top에 있으면
            cnt += 1 
            case.popleft() # 프린트
            if idx_case.popleft() == M: # case를 popleft 한 것처럼 idx case에서도 제거하는데, 원래 출력하려는 idx와 같으면
                print(cnt) # 여기까지만 출력하면 되므로 print(cnt)

        else:
            case.rotate(-1)
            idx_case.rotate(-1)

같은 중요도의 문서들을 구분하기 위해,
문서들 길이와 같은 인덱스 리스트를 만들어주어
리스트를 회전할 때 함께 회전하며 출력하게끔 하였다.

📌.rotate()

profile
Engineer

0개의 댓글