[백준] 프린터 큐 1966번 - Python

GoshK·2022년 2월 7일
0

[백준] Python

목록 보기
15/27
post-thumbnail

[백준] 프린터 큐 1966번

나의 풀이

from collections import *
import sys
K = int(sys.stdin.readline())
for i in range(K):
    N, M = map(int, sys.stdin.readline().split())
    index = deque([i for i in range(N)])
    priority = deque(list(map(int, sys.stdin.readline().split())))
    rank = 1
    if N == 1:
        print(1)
        continue
    while True:
        if priority[0] != max(priority):
            priority.append(priority.popleft())
            index.append(index.popleft())
        else:
            if index[0] != M:
                rank += 1
                priority.popleft()
                index.popleft()
                continue
            else:
                print(rank)
                break
  • 테스트 케이스를 K번 만큼 입력받는다.
  • N = 문서의 개수, M = 몇 번째로 출력되는지 궁금한 인덱스번호다.
  • 왼쪽은 0부터 시작하므로 0부터 N까지의 인덱스를 큐로 변환하여 index 변수에 저장해준다.
  • priority 변수에는 우선순위를 입력받고 큐로 변환해준다.
  • 순위는 1부터 시작하므로 rank 변수는 1로 두었다.
  • 만약 N 이 1 즉, 문서의 개수가 한 개일때는 우선순위 상관없이 해당 문서가 제일 먼저 출력되기 때문에 1을 출력하고 다음 계산을 위해 continue 를 해준다.
  • 그게 아니라면 M 번째의 문서가 몇번째 순서에 출력되는지 알기 위해 반복문을 돌려준다.
  • 만약 우선순위 큐에서 첫 번째 원소가 가장 높은 우선순위가 아니라면 맨 앞의 우선순위를 뒤로 보내고 그 다음 우선순위를 첫 번째 우선순위가 되도록 이동시킨다. 인덱스 역시 마찬가지로 똑같이 이동시켜준다. 이 과정은 첫 번째 우선순위가 가장 높은 우선순위가 될 때까지 반복된다.
  • 만약 첫 번째 우선순위가 가장 높은 우선순위라면 인덱스 큐의 첫 번째 원소가 M 과 같지 않다면 rank 를 1씩 더해주고, 가장 높은 우선순위의 인덱스와 우선순위를 제거해주고 다시 탐색을 시작한다. 그렇지 않고 만약 인덱스 큐의 첫 번째 원소와 M 이 같다면 궁금한 인덱스 번호를 찾았으므로 rank 를 출력해주고 while 문을 빠져나온다.

0개의 댓글