[BaekJoon 7662 : Data Structure, Python] - 이중 우선순위 큐

2021, Dec 04    


백준 7662 이중 우선순위 큐 : 골드 5



Solution


import sys
from heapq import *
from collections import defaultdict
input = sys.stdin.readline

def dualheapq(n):
    maxh = []
    minh = []
    out = defaultdict(int)

    i = 1
    cnt = 0
    for i in range(n):
        order, value = input().split()
        value = int(value)

        if order == 'I':
            heappush(maxh, [-value, i])
            heappush(minh, [value, i])
            out[i] = 0
            cnt += 1
            i += 1

        elif order == 'D' and cnt > 0:
            if value == 1:
                while out[maxh[0][1]]:
                    heappop(maxh)
                _, idx = heappop(maxh)
                out[idx] = 1

            elif value == -1:
                while out[minh[0][1]]:
                    heappop(minh)
                _, idx = heappop(minh)
                out[idx] = 1
            cnt -= 1
    
    if cnt > 0:
        while out[maxh[0][1]]:
            heappop(maxh)
        while out[minh[0][1]]:
            heappop(minh)
        mx, mn = -maxh[0][0], minh[0][0]
        print(f"{mx} {mn}")
    else:
        print("EMPTY")


tc = int(input())
while tc:
    n = int(input())
    dualheapq(n)
    tc -= 1


풀이과정 및 느낀점


  • 최대힙 최소힙을 각각 정의한다.
  • input 을 받을 때 두 힙에 모두에 입력값과, 해당 값의 index 값을 함께 저장한다
  • Delete order 값에 따라 -1 이면 최소힙에서, 1이면 최대힙에서 heappop 을 한다. (단, 비어있으면 pass)
  • 두 힙을 index 값을 기준으로 동기화시켜준다. (반복문 돌면서 해당 index 값 제거)
  • 최종적으로, 최대힙, 최소힙 각각에서 첫 번째 값을 출력해준다 (비었으면 EMPTY 출력)