import sys
import heapq#heapq는 최소힙만 지원한다 최대힙을 구현하기위해선 -를 곱해서 넣어 주고 꺼낼때 다시 -를 곱해준다
def middleheap(minheap,maxheap,x):#넣기만함
if len(maxheap)==len(minheap):#같다면 max힙에 넣어준다
heapq.heappush(maxheap,-x)
else:#max힙이 크다면 minheap넣어 균형을 맞춰준다.
heapq.heappush(minheap,x)
if minheap and -maxheap[0]>minheap[0]:#minheap이 비어잇지않고 최대 힙의 루트는 항상 최소 힙의 루트보다 작게 유지해준다.
#최대힙의 루트노드가 더크다면 스왑해주고 다시 힙구조로 만들어주어야한다.
a=heapq.heappop(minheap)
b=-heapq.heappop(maxheap)
heapq.heappush(maxheap,-a)
heapq.heappush(minheap,b)
n=int(sys.stdin.readline())
minheap,maxheap=[],[]
while n>0:
n-=1
middleheap(minheap,maxheap,int(sys.stdin.readline()))
print(-maxheap[0])
우선, 이 분은 input()이 아니라, int(sys.stdin.readline())이란 걸 사용했다. 무슨 차이인지 검색해 보았다.
다시 코드 분석으로 돌아가자. 이 분은 maxheap과 minheap을 2개 구현해서, 중간값을 구하려는 시도를 한 것이다. maxheap은 루트가 항상 제일 크다는 성질에, 루트가 가장 작은 minheap의 루트보다 항상 작게 유지함으로써, 중간값을 항상 maxheap의 루트로 만들어준 것이다. meaheap의 루트는 중간값, minheap의 루트는 중간값 + 1형태로 만든 것이다. maxheap부터 push하고, 항상 maxheap의 루트를 검사하므로, 짝수 홀수를 나눌 필요도 없어진다.
참고해서 내가 한 풀이
import sys
import heapq
def run():
minheap, maxheap = list(), list()
num = int(sys.stdin.readline())
for _ in range(num):
cur = int(sys.stdin.readline())
if len(maxheap) == len(minheap):
heapq.heappush(maxheap, -cur)
else:
heapq.heappush(minheap, cur)
if minheap and -maxheap[0] > minheap[0]:
tmp1 = -heapq.heappop(maxheap)
tmp2 = heapq.heappop(minheap)
heapq.heappush(maxheap, -tmp2)
heapq.heappush(minheap, tmp1)
print(-maxheap[0])
if __name__ == '__main__':
run()
안 보고 풀었는데 거의 완전 비슷하다. 다른 사람의 코드를 참고하면 이 점이 안 좋은 것 같다.