[백준 1966] 프린터 큐

Junyoung Park·2022년 3월 4일
0

코딩테스트

목록 보기
182/631
post-thumbnail

1. 문제 설명

프린터 큐

2. 문제 분석

큐 내에 존재하는 문서의 우선순위 정보를 파악하기 위해 먼저 Counter 모듈을 통해 개수를 구했고, 우선순위 로컬 최댓값 개수를 카운트하면서 0이 될 때 다음 우선순위를 가리키도록 지정했다. 케이스 문서 인덱스를 맨 앞의 경우와 나누어 뒤로 가거나 앞으로 당기도록 했다.

3. 나의 풀이

import sys
from collections import deque
from collections import Counter

t = int(sys.stdin.readline().rstrip())

for _ in range(t):
    n, m = map(int, sys.stdin.readline().rstrip().split())
    # m이 커서
    preferences = deque(list(map(int, sys.stdin.readline().rstrip().split())))
    preference_counter = Counter(preferences)
    preference_list = list(preference_counter.keys())
    preference_list.sort(reverse=True)
    # 현재 프린트 내 문서 중요도를 맨 앞에 있는 문서 중요도와 비교해서 개수 및 최고 중요도 파악. 내림차순 정렬
    print_cnt = 0
    # 현재 출력된 문서 수
    local_max = preference_list.pop(0)
    local_max_cnt = preference_counter.get(local_max)

    while preferences:
        preference = preferences.popleft()
        if preference == local_max:
            print_cnt += 1
            local_max_cnt -= 1
            if local_max_cnt == 0:
                # 큐에 있는 문서 중 최고 우선순위 문서가 모두 출력되었음
                if preference_list: local_max = preference_list.pop(0)
                local_max_cnt = preference_counter.get(local_max)
            if m == 0: break
            # 출력된 문서가 케이스라면 break
            else: m -= 1
            # 앞의 문서가 출력되었으므로 앞으로 한 칸 당긴다.
        elif preference < local_max:
            preferences.append(preference)
            if m == 0: m = len(preferences)-1
            # 케이스 문서를 맨 뒤로 넣었다
            else: m -= 1

    print(print_cnt)
profile
JUST DO IT

0개의 댓글