just inside
[백준] Silver 3. 1966 - 프린터 큐 python 본문
문제 링크
https://www.acmicpc.net/problem/1966
문제 설명
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.
- 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
- 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.
예를 들어 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 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.
출력
각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.
제출 코드
import sys
from collections import deque
t = int(input().rstrip())
for _ in range(t):
n, m = map(int, input().split())
docs = list(map(int, input().split()))
queue = deque([(i,p) for i, p in enumerate(docs)])
cnt = 0
while True:
i, p = queue.popleft()
if p == max(docs):
cnt += 1
docs.remove(p)
if i == m:
print(cnt)
break
else:
queue.append((i,p))
풀이
- 찾고자 하는 문서가 큐의 어떤 위치에 있는지 확인해야 한다. 따라서 enumerate를 사용해 초기 인덱스 번호와 중요도를 함께 큐에 저장해준다.
- 큐의 첫 번째 문서를 확인한다.
- 만약 저장된 문서의 중요도의 최대값과, 현재 문서의 중요도가 같다면 프린트 가능하다. 따라서 cnt 값을 하나 올려주고, 문서 중요도 리스트에서 해당 값을 제거해준다.
- 만약 현재 문서의 초기 인덱스(i)가 찾고자 하는 인덱스(m)와 같다면 결과를 출력해준다.
- 현재 문서보다 중요도가 높은 문서가 있다면, 다시 큐의 맨 뒤에 추가해준다.
알아둘 사항
- enumerate 함수 사용시, 인덱스와 요소를 함께 불러올 수 있어 유용하다.
'coding test > 스택&큐&덱&힙' 카테고리의 다른 글
[백준] Silver 2. 1874 - 스택 수열 python (0) | 2024.07.29 |
---|---|
[백준] Silver 4. 10845 - 큐 python (0) | 2024.07.26 |
[백준] Silver 4. 10828 - 스택 python (1) | 2024.07.25 |
[백준] Silver 4. 4949 - 균형잡힌 세상 python (2) | 2024.07.24 |
[백준] Silver 4. 2164 - 카드2 python (1) | 2024.07.23 |