1655번: 가운데를 말해요
첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
두개의 heap을 이용하자!
작은 수들은 maxheap에 큰 수들은 minheap에 저장하여 중앙값을 찾는다.
- bigheap에 첫번째 수를 저장한다. (중앙값은 bigheap[0])
- 두번째 수부터 중앙값(bigheap[0])보다 작다면 smallheap에 크다면 bigheap에 넣어준다.
- bigheap의 길이가 (i//2)+1개를 유지할 수 있도록 두 힙길이를 조절해준다.
import sys
import heapq
input = sys.stdin.readline
N = int(input())
smallheap = []
bigheap = [int(input())]
print(bigheap[0])
for i in range(2, N+1):
_input = int(input())
if bigheap[0] > _input:
heapq.heappush(smallheap, -_input)
else:
heapq.heappush(bigheap, _input)
while len(bigheap) < (i//2)+1:
heapq.heappush(bigheap, -heapq.heappop(smallheap))
while len(smallheap) < i-((i//2)+1):
heapq.heappush(smallheap, -heapq.heappop(bigheap))
print(bigheap[0])
'개발 > 알고리즘' 카테고리의 다른 글
| [백준 1991] 트리 순회 (python) (0) | 2021.04.28 |
|---|---|
| [백준 1202] 보석 도둑 (python) (0) | 2021.04.27 |
| [백준 21608] 상어 초등학교 (python) (0) | 2021.04.26 |
| [백준 14889] 스타트와 링크 (python) (0) | 2021.04.26 |
| [백준 2096] 내려가기 (python) (0) | 2021.04.26 |




최근댓글