1655번: 가운데를 말해요

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1

www.acmicpc.net


두개의 heap을 이용하자!

작은 수들은 maxheap에 큰 수들은 minheap에 저장하여 중앙값을 찾는다.

 

  1. bigheap에 첫번째 수를 저장한다. (중앙값은 bigheap[0])
  2. 두번째 수부터 중앙값(bigheap[0])보다 작다면 smallheap에 크다면 bigheap에 넣어준다.
  3. 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])
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기