Notice
Recent Posts
Recent Comments
Link
코테 탈출일지
[백준] 1966번: 프린터 큐 - 파이썬/python 본문
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
접근 방식
- 효율적인 반복문 구성 방법 고민
- 큐 활용방법 고민
코드 풀이
from collections import deque
t = int(input()) # 테스트케이스 수
for _ in range(t):
n, m = map(int, input().split()) # 문서의 수, 궁금한 책이 현재 있는 위치
query_book = m+1 # 궁금한 책의 번호
deq = deque()
imp_list = list(map(int, input().split())) # 중요도를 리스트로 저장
for i in range(n):
deq.append([i+1, imp_list[i]]) # deque에 책 번호와 중요도 순서대로 저장
answer = [] # 인쇄 문서번호를 순서대로 저장
while deq:
book_n, book_i = deq.popleft()
if any(book_i<x[1] for x in deq): # deq에 남아 있는 책들 중 중요도가 하나라도 높은게 있다면
deq.append([book_n, book_i]) # 다시 deq에 append
else:
answer.append(book_n) # 현재 인쇄 대기문서가 가장 큰 우선순위라면, 인쇄 진행
if book_n == query_book: # 이때 문서번호가 궁금한 책의 번호와 일치한다면
print(answer.index(book_n) + 1) # 해당 문서의 인덱스(순서)에 1 더해 출력
데크를 활용해 인쇄문서 대기열을 표현하였습니다. 데크에는 문서의 번호와 문서의 중요도가 튜플 형태로 묶여 들어가도록 했으며, popleft() 할때마다 대기열 안에 더 높은 중요도를 가지는 문서가 남아있는지 검사했습니다. 남아있는 경우 다시 데크에 오른쪽으로 추가해줬으며 그렇지 않은 경우에는 answer 리스트에 추가함으로써 인쇄 표기했습니다. 처음에 m의 정의를 '궁금한 책이 현재 있는 위치'가 아닌 '궁금한 책의 번호'라고 생각해 시간이 오래 소요됐습니다.
메모
- if any( x 조건식 for x in list)를 통해 코드 간단히 쓸 수 있습니다.
- 리스트 내의 특정 원소가 몇 번째 인덱스인지 출력하려면, list.index('a') 를 이용합니다.
참고
원소를 활용하여 인덱스를 찾는 두 가지 방법
import numpy as np
# 1. 리스트 활용
list_a = [4, 3, 2, 1, 1]
list_a.index(1) # 출력값: 3 (중복시 첫번째 값만 출력)
# 2. 어레이 활용
array_a = np.array(list_a) # array([4, 3, 2, 1])
np.where(array_a == 1) # 출력값: 3, 4 (중복 모두 출력)
'구현' 카테고리의 다른 글
[백준] 1051번: 숫자 정사각형 - 파이썬/python (0) | 2023.08.11 |
---|---|
[백준] 2477번: 참외밭 - 파이썬/python (0) | 2023.07.20 |
[백준] 1652번: 누울 자리를 찾아라 - 파이썬/python (0) | 2023.07.16 |
[백준] 2669번: 직사각형 네개의 합집합의 면적 구하기 - 파이썬/python (0) | 2023.07.16 |
[백준] 1476번: 날짜 계산 - 파이썬/python (0) | 2023.07.16 |