[BOJ]白準1966号プリンタキュー(Python)



質問する


ご存じのように、プリンタでは、印刷するドキュメントを印刷コマンドを受信した順序、すなわち、要求されたドキュメントを先に印刷します.複数の文書がキュー資料構造に積み重ねられている場合、FIFO-Firstの第1の出力に従って印刷されます.しかし、尚根は、以下の条件で印刷する新しいプリンタ内部ソフトウェアを開発した.
  • 現在のQueueの一番前の文書の「重要度」を確認します.
  • の残りのドキュメントに現在のドキュメントよりも重要なドキュメントがある場合は、そのドキュメントを印刷せずにQueueの一番後ろに再配置します.さもないとすぐに印刷します.
  • 例えばQueueには4つの文書(A B C D)があり、重要度が2 1 4 3であればCを印刷し、DとA、Bを印刷する.
    現在のキュー内のドキュメントの数と重要性を指定したときに、どのドキュメントが何回目に印刷されたかを特定します.例えば、上記の例では、Cドキュメントが1位、Aドキュメントが3位となっている.

    入力

  • の第1行は、試験例の数を与える.各テストボックスは2行で構成されています.
  • テストケースの最初の行は整数M(0≦M
  • のとき、一番左が0番目でした.2行目には、N個のドキュメントの重要度が順番に与えられています.
  • 重要度は1以上9以下の整数であり、同じ重要度の文書が複数ある場合があります.
  • しゅつりょく


    各テスト例について、ドキュメントの数回目の印刷を出力します.


    入力します。

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

    出力します。

    1
    2
    5

    from collections import deque
    
    test_case = int(input())			# 테스트케이스 입력
    for _ in range(test_case):			# 테스트케이스 만큼 반복
        n, m = map(int, input().split())
        _list = deque(map(int, input().split()))	# 큐 생성
    
        priority = max(_list)			# 가장 높은 우선순위 찾음
    
        while True:
            now = _list.popleft()			# 맨 앞 문서 가져옴
            m -= 1					# 목표물 위치 한 칸 앞으로 당겨짐
            if now != priority:			# 현재 가져온 문서가 우선순위가 가장 높지 않다면
                _list.append(now)			# 문서를 다시 뒤로 돌려보냄
                if m == -1:				# 현재 가져온 문서가 목표 문서
                    m = len(_list) - 1
                continue
            else:					# 현재 가져온 문서가 우선순위가 가장 높다면
                if len(_list) != 0: 		# 출력할 문서가 남아있을 경우
                    priority = max(_list)		# 가장 높은 우선순위 갱신
                if m == -1:				# 현재 가져온 문서가 목표 문서
                    print(n - len(_list))		# (전체 - 남은 문서) == 출력된 순서
                    break