[백준] 프린터큐
큐
그리디
백준
easy
문제
상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.
현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.
입력
첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음줄에 N개 문서의 중요도가 주어지는데, 중요도는 1 이상 9 이하이다. 중요도가 같은 문서가 여러 개 있을 수도 있다. 위의 예는 N=4, M=0(A문서가 궁금하다면), 중요도는 2 1 4 3이 된다.
3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1
출력
각 test case에 대해 문서가 몇 번째로 인쇄되는지 출력한다.
1
2
5
문제풀이
어려운 문제는 아니다. 입력받은 중요도와, 찾아야하는 문서의 인덱스를 튜플로 구성하고, 리스트에 넣은 뒤, 문제를 풀면 된다.
다만, 입력받을 경우 튜플을 구성하는 파이썬 방법과, max 값을 구할 수 있는 람다(lambda)
표현식은 익숙해져야겠다.
1. enumerate
- 반복문 사용 시 몇 번째 반복문인지 확인이 필요할 수 있습니다. 이때 사용합니다.
-
인덱스 번호와 컬렉션의 원소를
tuple
형태로 반환합니다. for문
으로 리스트에 넣는 방법
for i in range(len(print_weight)):
print_list.append((print_weight[i], i == F))
enumerate
활용
print_list = [(i, idx) for idx, i in enumerate(print_weight)]
2. lambda를 이용한 min max
if print_list[0][0] == max(print_list, key=lambda x:x[0])[0]:
첫번째 값 (가중치)가 MAX인 튜플의 값을 가져온다. 람다표현식에 익숙해져야겠다.
소스코드
test_case = int(input())
while test_case > 0:
N, F = list(map(int, input().split(' ')))
print_weight = list(map(int, input().split(' ')))
print_list = [(i, idx) for idx, i in enumerate(print_weight)]
count = 0
while len(print_list) > 0:
if print_list[0][0] == max(print_list, key=lambda x:x[0])[0]:
count += 1
if print_list[0][1] == F:
print(count)
break
else:
print_list.pop(0)
else:
print_list.append(print_list.pop(0))
test_case -= 1