

맨날 짤 선정 능력만 늘고 알고리즘은 안 늘고... 반성하는 중입니다.

(A + 1) // 2개의 원소가 있어야 합니다.(A + 1) // 2개가 됩니다.(3 + 1) // 2 = 2(6 + 1) // 2 = 3(A + 1) // 2개보다 적은 경우(A + 1) // 2개보다 많은 경우
import sys
import heapq
import math
input = sys.stdin.readline
min_heap = [] # 중앙값 이후 값을 담음
max_heap = [] # 중앙값 및 중앙값 이전 값을 담음
N = int(input()) # 총 숫자 수
for i in range(N):
num = int(input())
if i == 0: # 첫번째 숫자는, 최대 힙에 넣기
heapq.heappush(max_heap, -num)
mid_value = num
else:
if num > mid_value: # 중앙값 이후의 값
# 최소 힙에 푸시
heapq.heappush(min_heap, num)
else: # 중앙값 이전의 값
# 최대 힙에 푸시: 푸시할 때 음수 처리
heapq.heappush(max_heap, -num)
# 현재 최대 힙에 있어야 하는 원소 수
max_heap_len = (i + 2) // 2
# 최소 힙에서 최대 힙으로 원소 보내기
if len(max_heap) < max_heap_len:
popped = heapq.heappop(min_heap)
heapq.heappush(max_heap, -popped) # 최대힙은 음수처리!
# 최대 힙에서 최소 힙으로 원소 보내기
elif len(max_heap) > max_heap_len:
popped = -heapq.heappop(max_heap) # 최대힙은 음수처리!
heapq.heappush(min_heap, popped)
# 중앙값은 최대 힙의 루트 노드
mid_value = -max_heap[0]
print(mid_value)
heapq.heappush(max_heap, -num) 식으로 푸시 값을 음수 처리하고, 팝할 땐 반환값을 -heapq.heappop(max_heap), -max_heap[0]으로 음수 처리해야한다는 점 기억합시다.heapq 모듈은 최소 힙 기반이므로, 이런 처리가 필요합니다.i일 때 i + 1개 숫자가 입력된 상태므로, 최대 힙에 ((i + 1) + 1) // 2 -> (i + 2) // 2개의 원소가 있어야 정상입니다.heappush heappop 모두 최대 힙, 최소 힙을 둘 다 활용하면 최솟값, 최댓값 아닌 수도 꺼내올 수 있다.
단지 그 방법을 떠올리는 건 너의 몫이라는 점 ^^