[백준] 프린터 큐 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 문을 빠져나온다.