sm 기술 블로그

160. 1966(프린트 큐) - 파이썬 본문

문제/백준_파이썬

160. 1966(프린트 큐) - 파이썬

sm_hope 2022. 7. 26. 18:08
from collections import deque
import sys
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    N, M = map(int, input().split())
    importance = deque(list(map(int, input().split())))
    index = list(range(len(importance)))
    index[M] = 'T'

    cnt = 0

    while True:
        if importance[0] == max(importance):
            cnt += 1

            if index[0] == 'T':
                print(cnt)
                break
            else:
                index.pop(0)
                importance.popleft()

        else:
            index.append(index.pop(0))
            importance.append(importance.popleft())

문제요약

중요도가 높은 것부터 프린트를 하는데 선택한 프린트가 몇번째로 출력되는지 구하라.

설명

어떤식으로 돌아가는지를 먼저 이해해야한다.

예를 들어 6개의 프린트가 있고 0번째의 프린트를 해야한다고 하자.

그러면 0번째가 제일 앞에 있지만 중요도는 제일 높지 않아 맨 뒤 순위로 밀린다.

이런 식으로 반복하다 보면 중요도가 제일 높은 프린트 부터 출력하게 된다.

그 다음 모두 1이기 때문에 순서대로 출력을 하는데 결국 선택한 프린트물은 처음에 있었지만 5번째에 출력되게 된다.

 

    importance = deque(list(map(int, input().split())))
    index = list(range(len(importance)))

중요도와 인덱스를 따로 분리하였다.

 

    index[M] = 'T'

    cnt = 0

원하는 프린트는 인덱스 값을 숫자가 아닌 다른 문자로 표시했다.

cnt는 몇번째로 출력되었는지 알리기 위해서 작성하였다.

 

        if importance[0] == max(importance):
            cnt += 1

만약 중요도에서 최대값이 맨 앞에 있다면 먼저 횟수를 한번 증가시킨다.

 

            if index[0] == 'T':
                print(cnt)
                break
            else:
                index.pop(0)
                importance.popleft()

그게 우리가 선택한 프린트물이라면 순서를 출력하고 반복문을 종료한다.

그렇지 않다면 그냥 중요도가 제일 높은 문서이므로 그 값을 제거해준다.

 

        else:
            index.append(index.pop(0))
            importance.append(importance.popleft())

만약 중요도가 제일 높지 않다면 그 값은 맨뒤로 보내진다.

 

'문제 > 백준_파이썬' 카테고리의 다른 글

162. 1021(회전하는 큐) - 파이썬  (0) 2022.07.27
161. 10866(덱) - 파이썬  (0) 2022.07.27
159. 11866(요세푸스 문제 0) - 파이썬  (0) 2022.07.26
158. 2164(카드2) - 파이썬  (0) 2022.07.26
157. 18258(큐) - 파이썬  (0) 2022.07.25
Comments