본문 바로가기
프로그래밍/코딩 테스트

[백준] 1966 프린터 큐 (실버3, 59%)

by Devry 2025. 4. 15.

문제

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 이하의 정수이고, 중요도가 같은 문서가 여러 개 있을 수도 있다.

출력

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

예제 입력 1 복사

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

예제 출력 1 복사

1
2
5
 

풀이 💡

1. 나의 풀이

import sys
from collections import deque
input = sys.stdin.readline
n  = int(input())

for _ in range(n):
    N, M = map(int, (input().split()))
    queue = deque(map(int,input().split()))
    count = 0
    while queue:
        v = queue.popleft()
        maxv = 0
        if len(queue) > 0:
            maxv = max(queue)
        if v >= maxv:
            count += 1
            if M == 0:
                print(count)
                break
            else:
                M -= 1
        else:
            queue.append(v)
            if M == 0:
                M = len(queue) - 1
            else:
                M -= 1

 

2. 다른 풀이

t = int(input())

for _ in range(t):
    n, m = map(int, input().split())
    data = list(map(int, input().split()))
    
    result = 1
    while data:
        if data[0] < max(data):
            data.append(data.pop(0))

        else:
            if m == 0: break

            data.pop(0)
            result += 1

        m = m - 1 if m > 0 else len(data) - 1

    print(result)
출처: https://thisismi.tistory.com/entry/백준-1966번-프린터-큐-파이썬-정답-코드 [This is Mi:티스토리]

비교

나의 풀이는 while문에서 먼저 요소를 빼고 시작을 했는데 BFS풀던 습관 떄문인 거 같다.

 

다른 풀이는

1.'data[0] < max(data)' (맨앞 문서보다 중요도가 큰 문서가 있는가?) 먼저 확인

2.있으면 맨앞 요소를 맨 뒤로 보냄

3-1.없을 경우, 타겟(m)이 0이면 중단(타겟이 출력 대상이므로)

3-2.없을 경우, 타겟이 0이아니면 출력 후, 카운트 증가

4.타겟(m)을 변경

 

나의 풀이는

1.맨앞 요소를 먼저 뽑음

2.나머지 중에 최대값을 구함(비교 대상을 먼저 구한다고 생각함.)
  하지만 pop이후 max를써서 max([])케이스가 발생)

3-1.맨앞 요소가 가장 중요도가 크면 카운트 증가

3-2.타켓이(M) 0이면 중단 (타겟이 출력 대상이므로)

3-3.타겟이(M) 0이 아니면 M 감소

4-1.맨앞 요소보다 큰수가 있으면 뒤로 보냄

4-2.타켓이(M) 0이면 M을 맨 뒤의 인덱스로

4-3.타켓이(M) 0이 아니면 M 감소

 

타겟(M)의 처리를 최대값 비교 이후로 분리해야하는데 같이 하다보니 if가 많아짐

3-2, 4-2와 4-2, 4-3은 원래 두쌍씩 같은 로직이므로 하나로 합칠 수 있었다.

 

비교 대상을 굳이 먼저 구할 필요는 없다.

 

 

#알고리즘#코딩테스트#코테#백준#coding test#프로그래머스#문제 풀이

 

댓글