코딩테스트 대비/단계별 코딩 테스트 준비(27일 과정)

[우선순위 큐/Python] 1655번: 가운데를 말해요 - 효과는 굉장했다!

bluetag_boy 2022. 2. 19. 03:43
반응형
 

1655번: 가운데를 말해요

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

www.acmicpc.net

 

알고리즘 분류

  • 자료 구조
  • 우선순위 큐

 

 

SOLUTION

import sys
import heapq

N = int(sys.stdin.readline())
left = []
right = []

for _ in range(N):
    num = int(sys.stdin.readline())
    
    if len(left) == len(right):
        heapq.heappush(left, (-num, num)) # 최대 힙

    else:
        heapq.heappush(right, (num, num)) # 최소 힙
        
    # 왼쪽 루트가 오른쪽 루트보다 크다면 자리를 바꿔준다
    if right and left[0][1] > right[0][1]:
        rightValue = heapq.heappop(right)[1]
        leftValue = heapq.heappop(left)[1]
        # left에는 가장 큰 수가 root가 되어야 한다
        heapq.heappush(left, (-rightValue, rightValue))
        # right에는 가장 작은 수가 root가 되어야 한다
        heapq.heappush(right, (leftValue, leftValue))

    print(left[0][1])