골드 2의 난이도를 자랑하는 '가운데를 말해요'라는 문제이다.
문제의 내용은 간단하다.
모든 input이 들어올 때 마다 아직까지 들어온 input들의 중앙값을 출력해주면 된다.
하지만 정말 큰 문제는 해당 문제의 시간 제한이 0.1초이라는 점이다.
그렇기 때문에, 단순히 input이 들어올 때 마다 sort를 해서 중앙값을 출력해주면 너무너무 느려진다.
그래서 최소 및 최대 힙을 사용해서 이 문제를 풀어보았다.
import heapq
import sys
input=sys.stdin.readline
maxHeap=[]
minHeap=[]
n=int(input())
for i in range(n):
num=int(input())
if len(maxHeap)==len(minHeap):
heapq.heappush(minHeap, -1*num)
else:
heapq.heappush(maxHeap, num)
if maxHeap and -minHeap[0]>maxHeap[0]:
a=heapq.heappop(minHeap)
b=heapq.heappop(maxHeap)
heapq.heappush(minHeap,-b)
heapq.heappush(maxHeap,-a)
print(-minHeap[0])
중간값보다 작은 최대 힙, 중간값보다 큰 최소 힙을 만든다.
이렇게 되면, 중간 값은 최소 힙의 head가 된다.
만약 개수가 짝수개라면, 작은 수를 대답해야 하기 때문에, 먼저 최소 힙부터 채운다.
'Computer Science > Algorithm' 카테고리의 다른 글
BOJ 9576: 책 나눠주기 [Python 3] (0) | 2023.01.19 |
---|---|
BOJ 1202: 보석 도둑 [Python 3] (0) | 2023.01.14 |
BOJ 1715: 카드 정렬하기 [Python 3] (0) | 2023.01.06 |
BOJ 2110: 공유기 설치 [Python 3] (0) | 2023.01.06 |
BOJ 2805: 나무 자르기 [Python 3] (0) | 2023.01.06 |