문제풀이/백준

[python/파이썬] 백준 1966 - 프린터 큐 (실3)

bbugi 2023. 7. 17. 01:36

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net


자료구조 - 큐(queue)

 

파이썬에서 자료형 큐를 사용할때는 deque 로 사용하면 된다.

deque는 collections 라이브러리에 내장되어 있어 from collections import deque로 사용 가능하다.

-

queue는 '선'입 '선'출 형태 자료구조이고,

deque의 경우 양방향 큐로 선입,후입 어느쪽으로든 뺄 수 있다.

---

deque는 rotate(회전)이 가능한데

음수를 넣으면 왼쪽으로 회전 ( 맨 왼쪽 n개의 값을 가장 오른쪽으로 이동)

양수를 넣으면 오른쪽으로 회전 (맨 오른쪽 n개의 값을 가장 왼쪽으로 이동) 한다.

 

▷ deque.rotate(-2) : 왼쪽으로 2개 회전

ex) 1 2 3 4 5 6 → 3 4 5 6 1 2

 

deque.rotate(3) : 오른쪽 3개 회전

ex) 1 2 3 4 5 6 → 4 5 6 1 2 3

 

---

백준에 나와있는 예시는 rotate(1)로 해도 정답 출력값 이 나온다.

문제 풀 때 함수도 제대로 확인하고 풀자!


from collections import deque

t = int(input())

for _ in range(t):
    n, m = map(int, input().split())
    pop_num = []

    queue = deque([i+1 for i in range(n)])
    find_num = queue[m]
    imp_q = deque(map(int, input().split()))

    while True:
        if len(imp_q) == 0 :
            break
    
        max_idx = imp_q.index(max(imp_q))

        if max_idx != 0:
            queue.rotate(-1)
            imp_q.rotate(-1)
            continue

        elif max_idx == 0:
            pop_num.append(queue.popleft())
            imp_q.popleft()
            continue

    for num in pop_num :
        if find_num == num :
            print(pop_num.index(num) + 1)