티스토리 뷰

728x90

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

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net


  • 해설 : 

프린터기가 다음과 같은 조건으로 동작한다.

  1. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
  2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.

예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중요도가 2 1 4 3 라면 C를 인쇄하고, 다음으로 D를 인쇄하고 A, B를 인쇄하게 된다.

프린터의 큐에 들어있는 문서와 문서의 중요도가 주어질 때, 문서가 몇 번째로 출력되는지 찾는 문제이다. 

 

 

 


  • 풀이 :

 

큐를 사용하여 현재 출력물이 중요도 1순위가 아닐 경우 맨 뒤로 보내는 작업을 반복하여 주어진 조건에 맞게 구현하면 된다.

 

 


  • 소스코드 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys
input = sys.stdin.readline
= int(input())
for i in range(t):ㅁimport sys
from collections import deque
input = sys.stdin.readline
 
if __name__ == "__main__":
    for _ in range(int(input())):
        N,M = map(int,input().split())
        weight = deque(list(map(int,input().split())))
        cnt = 0
        check = weight.copy()
        for i in range(N):
            weight[i] = [weight[i],i]
        while weight:
            x = weight[0]
            if x[0!= max(check):
                weight.append(x)
                weight.popleft()
                check.append(check.popleft())
            else:
                cnt += 1
                weight.popleft()
                check.popleft()
                if x[1== M:
                    print(cnt)
                    break
 
    n = int(input())
    s = [0 for i in range(n + 1)]
    for j in range(n):
        a, b = map(int, input().split())
        s[a] = b
    min_n = s[1]
    cnt = 0
    for k in range(2, n + 1):
        if s[k] > min_n:
            cnt += 1
        else:
            min_n = s[k]        
    print(n - cnt)
cs
320x100
댓글
© 2022 WonSeok, All rights reserved