동까의 코딩

[Python] 백준 1966 : 프린터 큐 본문

문제 풀이/백준

[Python] 백준 1966 : 프린터 큐

동까의 코딩 2024. 3. 9. 19:34
반응형

오늘은 프린터 큐 문제를 풀어보았습니다.

문제는 구조는 기본 Queue의 자료구조인 FIFO - First In First Out를 문제로 만들었습니다.

 

 

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

 

1966번: 프린터 큐

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

www.acmicpc.net

 

문제 풀이 방법으로는 deque를 사용해서 최대한 queue에 중점을 주고 문제를 풀었습니다.

1. 먼저 m의 위치를 기억해 주고, 위치를 옮겨줄 때마다 위치를 업데이트해 준다.

2. 가장 큰 값이 먼저 나가므로 맨 앞에 가장 큰 값이 오면 pop을 진행하고 count를 올려준다.

3. 값이 나갈 때 m의 위치가 맨 앞에 위치하면 count를 출력하고, 반복문을 중지한다.

 

from collections import deque

t = int(input())

for _ in range(t):
    n, m = map(int, input().split(' '))
    cnt = 1
    num_list = deque(map(int, input().split(' ')))
    
    while True:
        max_num = max(num_list)
        if num_list[0] == max_num:
            if m == 0:
                print(cnt)
                break
            num_list.popleft()
            m -= 1
            cnt += 1
            if m < 0:
                m = len(num_list) - 1

        else:
            num_list.append(num_list.popleft())
            m -= 1
            if m < 0:
                m = len(num_list) - 1

 

 

다른 풀이 방법

enumerate를 사용하여 (숫자, 위치)를 queue에 넣어줘서 푸는 방법이 있다. 해당 방법이 더 간편한 코드로 나온다.

t = int(input())

for _ in range(t):
    n, m = list(map(int, input().split(' ')))
    num_list = list(map(int, input().split(' ')))
    num_list = [(i, idx) for idx, i in enumerate(num_list)]

    cnt = 0
    while True:
        if num_list[0][0] == max(num_list, key=lambda x : x[0])[0]:
            cnt += 1
            if num_list[0][1] == m:
                print(cnt)
                break
            else:
                num_list.pop(0)
        else:
            num_list.append(num_list.pop(0))

 

 

오늘도 감사합니다.

반응형

'문제 풀이 > 백준' 카테고리의 다른 글

[Python] 백준 13565 : 침투  (0) 2024.03.30
[Python] 백준 5397 : 키로거  (0) 2024.03.10
[Python] 백준 1874 : 스택 수열  (0) 2024.03.09
[Python] 백준 2920 : 음계  (0) 2024.03.09
[Python] 백준 2083 : 럭비 클럽  (0) 2024.03.05