728x90

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

 

1966번: 프린터 큐

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

www.acmicpc.net

 

# 조건

  • 문서의 우선 순위에 따라 인쇄를 진행한다.
  • 우선 순위는 동일할 수 있다.
  • 우선 순위가 가장 높은 경우가 인쇄 차례일 때만 인쇄를 진행한다.
  • 이 때 몇 번째로 인쇄되는지 궁금한 문서의 인덱스가 주어질 때
  • 몇 번째 인쇄되는지 구하여라.
 

# 접근 방법

  • 문제에 나와있듯이 deque를 이용하여 앞에서의 출력, 뒤로 입력을 해주었다.
  • 이 때, 처음 궁금했던 문서였음을 알리기 위하여 인덱스를 저장해주고, 문서의 위치에 따라 변경해주었다.
  • 0번 인덱스에 있지만, 최상위 우선순위가 아닌 경우 제일 뒤로가는데
  • 이 때, 내가 활용하고 있는 q 리스트의 길이-1로 넣어주면 된다.
import sys  
from collections import deque  
sys.stdin = open('input.txt')  
  
def docu(M):  
    # deque 활용  
    q = deque(priority)  
    # 문서 출력 횟수  
    cnt = 0  
    # 궁금한 문서 인덱스  
    m = M  
    while q:  
        # 첫 문서의 중요도가 가장 높다면  
        if q[0] == max(q):  
            # 내가 뽑고자 하는 인덱스가 제일 앞에 있다면 return            
            if m == 0:  
                return cnt + 1  
            # 그게 아니라면  
            # 인쇄하고 카운트  
            q.popleft()  
            cnt += 1  
            # 인덱스가 0이라면 제일 뒤의 인덱스로 옮겨주고  
            if m == 0:  
                m = len(q) - 1  
            # 그게아니라면 -1            
            else:  
                m -= 1  
        else:  
            # 우선순위가 최상위가 아니라면 뽑고 추가 해준다.  
            q.append(q.popleft())  
            # 인덱스가 0이라면 제일 뒤의 인덱스로 옮겨주고  
            if m == 0:  
                m = len(q)-1  
            # 그게아니라면 -1            
            else:  
                m -= 1  
    return cnt  
T = int(input())  
  
for tc in range(T):  
    N, M = map(int, input().split())  
    priority = list(map(int, input().split()))  
  
    print(docu(M))
728x90