[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 출력)