시간제한 : 2초
메모리 제한 : 128MB
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.
예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중요도가 2 1 4 3 라면 C를 인쇄하고, 다음으로 D를 인쇄하고 A, B를 인쇄하게 된다.
여러분이 할 일은, 현재 Queue에 있는 문서의 수와 중요도가 주어졌을 때, 어떤 한 문서가 몇 번째로 인쇄되는지 알아내는 것이다. 예를 들어 위의 예에서 C문서는 1번째로, A문서는 3번째로 인쇄되게 된다.
첫 줄에 테스트케이스의 수가 주어진다. 각 테스트케이스는 두 줄로 이루어져 있다.
테스트케이스의 첫 번째 줄에는 문서의 개수 N(1 ≤ N ≤ 100)과, 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수 M(0 ≤ M < N)이 주어진다. 이때 맨 왼쪽은 0번째라고 하자. 두 번째 줄에는 N개 문서의 중요도가 차례대로 주어진다. 중요도는 1 이상 9 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.
각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
1
2
5
from collections import deque
import sys
t = int(sys.stdin.readline().strip())
for _ in range(t):
dq = deque()
n, m = map(int, sys.stdin.readline().strip().split())
ranks = list(map(int, sys.stdin.readline().strip().split()))
for i, rank in enumerate(ranks):
# 중요도가 똑같을 시 몇 번째로 출력할지 모르기에 i도 추가
dq.append((i, rank))
# index 저장 후 중요도에 따라 정렬
ranks.sort()
count = 0
while(dq):
# dq의 첫번째 원소 출력해 저장
i, rank = dq.popleft()
# 중요도 제일 높냐 ? -> 출력 대상
if rank == ranks[-1]:
ranks.pop()
count += 1
# 그리고 그 출력한 대상의 인덱스가 m과 같냐
if i == m:
# 그럼 종료
print(count)
break
else:
# 아니면 뒤에 삽입
dq.append((i, rank))
시간 : 68ms
메모리 : 34112KB
프린터 큐 문제는 Queue 구현 + 중요도이므로 일반적인 Queue 구현보다는 난이도가 있다.
이 문제를 풀면서 이것저것 해보다가 파이썬의 내장 함수인 enumerate를 쓰면 쉽게 풀 수 있을 거 같아 적용해 코드를 작성했다.
t
만큼 for문 반복dq
에 큐
를 선언하고, n과 m
, 그리고 중요도 정수
들을 입력enumerate()
함수를 통해 돌며 dq에 인덱스
와 요소
를 저장ranks
를 중요도 순으로 정렬
while
문은 dq
의 모든 원소가 출력될 때까지로 설정(그 전에 break
가능)dq
의 첫 번째 원소를 popleft()
를 통해 꺼내어 i
, rank
에 저장제일 높은 경우
: ranks
에서 pop()
을 통해 꺼내고 출력 횟수를 의미하는 count += 1
, 그 후 출력 순서를 알고싶은 정수 m
인 경우 출력하고 루프에서 break
i
, rank
를 다시 dq
에 append()
를 통해 삽입