https://www.acmicpc.net/problem/7662
(요약)
처음엔 우선순위 큐를 하나만 가지고 운영하면서 최대값/최소값 명령에 따라 그때그때 최소힙/최대힙으로 변환하는 작업을 고려했다. 하지만 이 경우 최소힙/최대힙으로 재정렬하는 작업이 반복되어 비효율적이고, 시간제한도 지키기 힘들다.
따라서 힙 자체를 최소힙, 최대힙 두개로 운영하여 최소값 삭제 명령시 최소힙에서 heappop()을 호출, 최대값 삭제 명령시 최대힙에서 heappop()을 호출하는 방향으로 구현하고자 했다.
이때 최소힙과 최대힙의 동기화를 고려해야 한다. (최소힙에서 이미 삭제한 데이터를 최대힙에서 최대값으로 찾는 오류 방지 차원.. 그 반대도 마찬가지)
나는 deleted
리스트를 사용해 이미 삭제된 데이터인지 표시해두고, 힙에서 이미 삭제된 데이터는 제외하고 최대값/최소값을 판별할 수 있도록 아래와 같이 코드를 구성했다.
import sys
input = lambda: sys.stdin.readline().rstrip()
import heapq
t = int(input())
for _ in range(t):
k = int(input())
maxH = []
minH = []
deleted = [False] * k
for i in range(k):
comm = list(map(str, input().split()))
c = comm[0]
n = int(comm[1])
if c == "I":
heapq.heappush(maxH, (-n, i))
heapq.heappush(minH, (n, i))
else:
if n == 1: #최대값 삭제
while maxH and deleted[maxH[0][1]]:
heapq.heappop(maxH)
if maxH:
deleted[maxH[0][1]] = True
heapq.heappop(maxH)
else: #최소값 삭제
while minH and deleted[minH[0][1]]:
heapq.heappop(minH)
if minH:
deleted[minH[0][1]] = True
heapq.heappop(minH)
while maxH and deleted[maxH[0][1]]:
heapq.heappop(maxH)
while minH and deleted[minH[0][1]]:
heapq.heappop(minH)
if maxH and minH:
print(-maxH[0][0], minH[0][0])
else:
print("EMPTY")
내장함수
min
max
를 사용하면 안될까?
(1) 의사코드
k = int(input())
h = []
for i in range(k):
comm, n = input().split()
if comm == "I": # (1) 데이터 삽입
h.append(n)
else:
if n == 1:
# (2) 최대값 삭제
maxN = max(h)
h.remove(maxN)
else:
# (3) 최소값 삭제
minN = min(h)
h.remove(minN)
(2) 시간 복잡도 분석
(3) 결론
당연히 안된다. (^^;)