미소를뿌리는감자의 코딩

[백준 2024/02/06] 1966번 프린터 큐 본문

코딩 테스트/백준

[백준 2024/02/06] 1966번 프린터 큐

미뿌감 2024. 2. 6. 16:07
728x90

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

 

1966번: 프린터 큐

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

www.acmicpc.net

1. 접근 방법

여기서, 구하고자 하는 것은 n 번째 index가 몇 번째로 출력하는가 이다.

중요도가 1 이상 9 이하의 정수라는 점에 주목했다. n 번째 index의 중요도를 0으로 대치시켜 놓고, temp 변수에 n 번째 index의 중요도를 따로 저장해 두었다. 구하고자 하는 종이를 0으로 특별히 하이라이트 한 느낌..!

temp = 0
numbers[want], temp = temp, numbers[want]

 

 

n개의 문서 중요도는 numbers라는 list에 저장해두었다.

 

while 문

이후 numbers[0] 이 (맨 앞에 있는 종이의 중요도가)

1. 중요도가 0 인지 (구하고자 하는 종이인지)

2. max(numbers)< temp 인지, 즉, 구하고자 하는 n 번째 종이의 중요도가 다른 max(numbers)보다 높은지
(이를 고려해주는 이유는, n 번째 문서의 중요도를 0 으로 바꾸었기 때문이다)

 

를 통해서, while 문을 돌렸다.

-> 두 경우가 참인 경우는, 구하고자 하는 문서가 맨 앞에 와있으며, 중요도도 다른 list에 남아있는 최댓값보다 큰 경우이다.

 

pop vs. pop and append

1)만약 numbers의 최댓값이 맨 앞에 있는 종이의 중요도와 같지 않은 경우

2) 맨 앞에 있는 중요도와 numbers의 최댓값이 같지만, temp 보다 작은 경우 (구하고자 하는 종이의 중요도 보다 낮은 경우)

pop을 한 후, list의 맨 뒤에 append 해주었다.

 

두 경우에 해당하지 않은 경우는, 맨 앞에 있는 종이의 최댓값이 max(numbers)과 같으며, temp 중요도 보다 큰 경우에 해당한다.

즉, 출력 대상이 되는 경우이다.

 

2. 코드

def st():
    temp = 0
    turn = 0

    papers, want = map(int, input().split())
    numbers = list(map(int, input().split()))

    numbers[want], temp = temp, numbers[want]
    while(numbers[0]!=0 or temp<max(numbers)):
        #print(numbers)
        max_c = max(numbers)
        popped = numbers.pop(0)
        if max_c!=popped or max_c<temp:
            numbers.append(popped)
        else:
            turn +=1
            #print(turn)
    turn+=1
    return turn


num = int(input())

for i in range(num):
    print(st())
728x90