Algorithm/BaekJoon

[boj 1966.python] 프린터 큐 풀이

쉬지마 이굥진 2024. 1. 4. 18:00

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

 

1966번: 프린터 큐

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

www.acmicpc.net


문제


문제 이해

1. 예시를 읽고 아, 중요도의 순서 숫자가 큰 순서대로 중요하다는 거구나 생각했다.

현재 문서는 0번째이고, 문서의 중요도를 체크하기 위해서는 내장함수 max()를 사용하면 되겠다고 생각했다.

 

2. 중요한 것은, 중요도가 높은 문서가 입력되면 앞서 대기하던 문서는 뒤로 밀린다는 점이다. 그렇다면 큐를 이용해 문서의 순서를 관리하면서 문서의 중요도에 따라 출력 순서를 변경하는 식으로 문제를 풀어보려고 했다. 0번째보다 더 큰 중요도를 가진 문서가 있다면 0번째 문서를 pop()하고 큐의 맨 뒤에 추가한다.

 


문제 풀이

1. 먼저 테스트 케이스의 개수 t를 입력받는다.

t = int(input())

 

2. 각 테스트 케이스에 대해, 케이스 문서의 수 n과 출력 순서를 모르는 문서의 현재 위치 m을 입력받는다.

n, m = map(int, input().split())

 

3. 문서의 우선순위가 저장된 리스트 data를 입력받는다.

 data = list(map(int, input().split()))

 

4. 0번째인 현재 문서와, 현재 문서보다 더 중요한 문서가 있는지 확인하기 위해 max() 내장함수로 값을 비교해준다. max값이 더 크다면, 0번째 문서를 pop으로 삭제해주고 큐의 맨 뒤에 append로 추가해준다.

while data:
        if data[0] < max(data):
            data.append(data.pop(0))

        else:
            if m == 0: break

 

5. 현재 문서가 중요도가 제일 높아서 프린트 되든, 현재 문서보다 더 중요한 문서가 있어 큐의 맨 뒤로 이동하든 타겟 문서의 인덱스 (현재 위치) m은 1이 감소하게 된다.  (m = m - 1)

이때 m == 0 이지만, 이것보다 더 중요한 문서가 있어서 뒤로 이동하게 된다면 m == len(큐) - 1이 된다. 

반면 m == 0 이고, 이 문서가 제일 중요한 문서라면 해당 문서가 출력된다.

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

 

6. 이런 과정을 for문으로 반복   >  결국에는 모든 문서가 그 중요도에 따라 출력되게 되며, 우리는 원하는 문서가 몇 번째로 출력될 지 알 수 있다.


정답 코드

t = int(input())

for _ in range(t):
    n, m = map(int, input().split()) # 케이스 문서의 수 n, 출력 순서를 모르는 문서의 현재 위치 m 입력받기
    data = list(map(int, input().split()))	# 문서의 우선순위가 저장된 리스트 data를 입력받음
    
    count = 1					# 초기화
    while data:
        if data[0] < max(data):		# 현재 문서의 우선순위가 가장 높은지 확인
            data.append(data.pop(0))
        else: 
            if m == 0: break
                
            data.pop(0)			# 출력이 이루어지면 해당 문서를 제거한 후
            count += 1			# count 증가시킴
            
        m = m -1 if m > 0 else len(data) - 1   # 우선순위가 가장 높지 않은 경우, 문서를 맨 뒤로 이동시키고 m값 조정
 print(count)				# 반복문 종료 시 테스트 결과인 count 출력

마치며

그 ... 냥 하자 ..