[백준 1966] 프린터 큐

민주·2022년 8월 8일
0

Algorithm

목록 보기
27/37
post-thumbnail
post-custom-banner

https://www.acmicpc.net/problem/1966

문제

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.

  1. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
  2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 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 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.

출력

각 테스트 케이스에 대해 문서가 몇 번째로 인쇄되는지 출력한다.

입출력 예

입력출력
31
1 02
55
4 2
1 2 3 4
6 0
1 1 9 1 1 1

풀이

프로그래머스에 있는 프린터 문제랑 비슷해서 확인겸(?) 풀어보았다. 제목부터 프린터 "큐"라서 큐 사용해서 풀어보았음!

각 문서들의 중요도와 인덱스를 주고 특정 인덱스의 문서가 몇번째로 출력되는지 구해야하는 문제였다. 처음에는 큐를 프린트 목록이라 생각하고 목록에서 pop한 값이 최대값인지 확인해서 맞으면 result에 1을 더해주는 방식을 생각했다. 그리고 인덱스를 확인할 방법을 생각하다가 애초에 큐에 넣을때 enumerate로 (인덱스, 중요도)를 묶어서 넣는 방법을 떠올렸다. 최대값을 확인할 때는 priority를 오름차순 정렬해서 priority[-1]를 썼고, 프린트됐을 때 하나씩 pop해주면서 진행했다.

방금 프로그래머스에서 프린트 문제 어떻게 풀었는지 찾아봤는데 그때도 enumerate로 풀었구나ㅋㅋㅋ 달라진 점은 그 때는 코테 공부 초반이었어서 다른 분들 풀이 참고해서 풀어서 queue인 척 하는 stack으로 더 간결하게 풀었던 거 같다. 그래도 생각 자체는 비슷한 듯 그리고 이번엔 혼자 생각하고 풀어서 더 뿌듯하다 ㅎㅎ

코드

from collections import deque

tc = int(input())
for _ in range(tc):
    n, m = map(int, input().split())
    priority = list(map(int, input().split()))
	
    # 중요도를 (인덱스, 중요도) 형식으로 바꾼 뒤 queue에 추가
    q = deque()
    for p in enumerate(priority):
        q.append(p)
	
    # priority 정렬 (priority[-1]이 최대값이 되도록)
    priority.sort()
    result = 0
    while q:
        nums = q.popleft()
        # pop한 중요도가 최대값일 때 답에 1 더하기, priority에서 최대값 pop
        if nums[1] == priority[-1]:
            result += 1
            priority.pop()
            # pop한 인덱스가 target한 인덱스와 같다면 답 출력 후 다음 테스트케이스로 넘어가기
            if nums[0] == m:
                print(result)
                break
        # pop한 중요도가 최대값이 아닐 때 큐의 맨 뒤로 보내기
        else:
            q.append(nums)
profile
꾸준히 ⭐️
post-custom-banner

0개의 댓글