https://www.acmicpc.net/problem/7662
7662번: 이중 우선순위 큐
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적
www.acmicpc.net
풀이 과정
- 최소히프, 최대히프를 만들어 두고, 실제 데이터 개수를 체크할 딕셔너리를 하나 만들어 둔다.
- 데이터 삽입
- 데이터를 최소히프, 최대히프에 모두 삽입
- 딕셔너리 내 해당 데이터 개수를 1개 증가시켜 준다.
- 데이터 삭제
- 최소값을 뽑아야 하면 최소히프에서 빼준다.
- 최댓값을 뽑아야 하면 최대히프에서 빼준다.
- 단, (1), (2) 과정에서 뽑은 데이터에 대응되는 데이터 개수가 0개인 경우에는 이미 다른 히프에서 빼준 것이므로, 다시 빼주어야 한다.
- 마지막에 큐가 비어있다면 Empty를, 비어있지 않다면 최댓값, 최솟값을 출력한다.
- 각각 최대히프, 최소히프에서 빼주고, 만약 빼줄 데이터가 없는 경우에는 Empty를 출력시켜주면 된다.
소스 코드
import heapq
import sys
from collections import defaultdict
input = lambda: sys.stdin.readline().rstrip()
T = int(input())
for _ in range(T):
min_heap = []
max_heap = []
element_dict = defaultdict(lambda: 0)
K = int(input())
for __ in range(K):
cmd, data = input().split()
data = int(data)
if cmd == 'I':
heapq.heappush(min_heap, data)
heapq.heappush(max_heap, -data)
element_dict[data] += 1
if cmd == 'D':
if data == -1:
while min_heap:
r = heapq.heappop(min_heap)
if element_dict[r] > 0:
element_dict[r] -= 1
break
else:
while max_heap:
r = heapq.heappop(max_heap)
r = -r
if element_dict[r] > 0:
element_dict[r] -= 1
break
min_value = None
max_value = None
while min_heap:
r = heapq.heappop(min_heap)
if element_dict[r] > 0:
min_value = r
break
while max_heap:
r = heapq.heappop(max_heap)
r = -r
if element_dict[r] > 0:
max_value = r
break
if min_value == None:
print('EMPTY')
else:
print(max_value, min_value)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 3055 ] [ BFS ] 탈출 (0) | 2021.11.09 |
---|---|
[ 1449 ] [ Greedy ] 수리공 항승 (0) | 2021.11.08 |
[ 1202 ] [ heap ] 보석 도둑 (0) | 2021.11.06 |
[ 3085 ] [ 구현 ] 사탕 게임 (0) | 2021.11.05 |
[ 2503 ] [ 완전 탐색 ] 숫자 야구 (0) | 2021.11.04 |