문제

[BaekJoon] 1966 프린터 큐


풀이

문제 이해 하는 데에만 엄청 오래걸렸다. inputoutput이 헷갈려서 문제를 여러 번 봤다. 코드 작성하다가도 헷갈려서 계속 봤다 또 봤다.

Input

일단 input은

첫 번째 줄에는 testcase 수

두 번째 줄에는 문서 갯수 N출력 순서가 궁금한 문서의 현재 위치 M

세 번째 줄은 N개의 각 문서의 중요도이다.

M을 이해하는데에 시간이 많이 걸렸다.

Output

M과 함께 Output도 뭔 말인지 잘 이해 안갔지만 직접 끄적여보면서

” index가 M인 문서는 몇 번째로 출력되는가? “ 로 정리가 된 다음 부터는 이해가 잘갔다.

KakaoTalk_20231212_065321207

최종 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
from collections import deque

T = int(sys.stdin.readline().strip()) # testcase num

for i in range(T):
    n, m = map(int, sys.stdin.readline().strip().split())
    priority = deque(list(map(int, sys.stdin.readline().strip().split())))

    cnt = 0
    while priority:
        if priority[0] == max(priority): # 맨 앞이 중요도 top 이라면
            cnt += 1                     # 출력되므로 cnt++
            priority.popleft()           # 제거
            if m == 0:
                break
        else:                                   # 중요도가 나중순위라면
            priority.append(priority.popleft()) # 맨 뒤로
        
        if m > 0:
            m = m - 1
        else:
            m = len(priority) - 1

    print(cnt)

m은 input 값이고, 몇 번째로 출력되는지 알아야 할 문서의 현재 index이다.

priority는 중요도로 popleft()를 사용하기 위해 deque()를 사용하였다.

  1. 우선, priority가 존재하는 동안 while문을 돈다.
  2. 맨 앞의 중요도가 가장 높은 중요도라면 프린터에서 출력함과 동시에 출력순서 cnt를 1 더해준다.
  3. 이 때 m == 0이라면 궁금한 문서라는 뜻이므로 break문으로 반복문을 탈출하고 print한다.
  4. 맨 앞의 중요도가 나중 순위 중요도라면 맨 뒤로 물러난다.
  5. m이 0보다 크다면 m을 1씩 빼주고, 아니라면 제일 뒤로 이동한다.

Leave a comment