BOJ | Sliver | 1966번 프린터 큐
문제
https://www.acmicpc.net/problem/1966
코드
import sys
cases = int(sys.stdin.readline())
for case in range(cases):
n, m = map(int, sys.stdin.readline().strip().split())
doc_list = list(map(int, sys.stdin.readline().strip().split()))
doc_list = [(idx, doc) for idx, doc in enumerate(doc_list)]
count = 1
while True:
if doc_list[0] == max(doc_list, key=lambda x:x[1]):
if doc_list[0][0] == m:
print(count)
break
doc_list.pop(0)
count +=1
else:
doc_list.append(doc_list.pop(0))
풀이
이 문제의 핵심은 세 가지라고 생각한다.
- 큐(Queue) 자료구조
- 문서의 중요도는 중복될 수 있음
- 문서의 구분은 인덱스로 할 것 (주어지는 값은 문서의 중요도 밖에 없으나, 문서를 특정할 수단이 필요함)
입력받은 각 문서의 중요도를 인덱스와 중요도를 한 쌍으로하는 리스트로 다시 재구성을 진행하고 이후 코드를 진행하였다.
여기서의 가장 큰 핵심은 큐 자료구조이기 때문에, 맨 앞에 있는 문서의 중요도가 가장 높은 중요도가 아니라면, 맨 뒤로 보내는 작업이 필요하다.
만약, 맨 앞에 있는 문서의 중요도가 가장 높은 중요도인 문서라면 출력이 진행될 것이고, 이때 몇 번째 출력(count
)인지 확인한다. 이때 출력이 진행되는 문서가 사용자가 알고싶은 문서의 출력 순서라면 count
를 출력하고 while문을 종료(break
)한다.
max 함수의 key 파라미터 사용
파이썬의 max()
함수는 리스트나 튜플에서 최대값을 찾아 반환하는 함수이다. 일반적으로는 max(arr)
와 같은 형태로 함수를 사용한다.
하지만 max()
함수에 넘겨주는 리스트의 요소가 리스트 혹은 튜플로 구성되어 있고, 여기서 최대값은 어떻게 반환될까?
리스트 요소의 첫번째 값(index = 0)을 비교하여 최대 값의 튜플을 반환하는 것을 확인할 수 있다. 만약 첫번째 값이 아니라 두번째 값으로 비교하여 최대값을 찾고 싶다면 어떻게 할까? 이때 사용하는 것이 바로 max()
함수의 key
파라미터이다.
arr = [(1, 4), (2, 3), (4, 5), (0, 7)]
max(arr, key=lambda x:x[1])
위와 같이 사용하면 arr
에 들어있는 요소 x
의 index=1
의 값을 이용하여 비교한다는 의미가 된다. 위 결과는 각 요소의 1번 인덱스 값이 가장 큰 (0,7)
을 반환하게 된다.
key
파라미터를 사용하면 내가 원하는 위치의 값을 비교하여 최대값을 반환할 수 있다.
'Problem Solving > BOJ' 카테고리의 다른 글
BOJ | 파이썬 | Sliver | 18110번 solved.ac (with. round 함수 사용으로 인한 문제) (0) | 2024.05.06 |
---|---|
BOJ | 파이썬 | Sliver | 4949번 균형잡힌 세상 (with. input과 sys.stdin.readline의 차이) (0) | 2024.04.12 |
BOJ | 파이썬 | Sliver | 2164번 카드2 (feat. 2161번 카드1) (0) | 2024.04.08 |
BOJ | 파이썬 | Sliver | 10815번 숫자 카드 (0) | 2024.04.05 |
BOJ | 파이썬 | Sliver | 1920번 수 찾기 (with. 이진 탐색 알고리즘) (0) | 2024.04.05 |