🧑💻 [Python] 백준 2696 - 중앙값 구하기
Gold 3 - heapq

left와 right 힙 그리고 중간 값을 가지고 문제를 푸는 것이다
left는 최대 힙을 구하는 것이고, right은 최소힙을 구하는 것이다
middle은 제일 최근에 구한 중간 값이다
즉 수열의 원소가 middle보다 작으면 left로 들어가야 하고, 크면 right로 들어가야 한다


코드
import heapq
import math
T = int(input())
for _ in range(T):
    N = int(input())
    nums = []
    for _ in range(int(math.ceil(N / 10))):
        nums += list(map(int, input().split()))
    left, right = [], []
    middle = nums[0]
    result = [nums[0]]      
    for i in range(1, N):
        # 숫자가 중앙 숫자보다 작으면 left 힙 (최대 힙)에 넣는다
        if nums[i] < middle:
            heapq.heappush(left, -nums[i])
        # 중앙 숫자보다 크면 right 힙에 넣는다
        else:
            heapq.heappush(right, nums[i])
        if i % 2 == 0:
            if len(left) > len(right):
                heapq.heappush(right, middle)
                middle = -heapq.heappop(left)
            elif len(left) < len(right):
                heapq.heappush(left, -middle)
                middle = heapq.heappop(right)
            result.append(middle)
    print(len(result))
    if len(result) / 10 < 1:
        print(' '.join(map(str, result)))
    else:
        for i in range(int(math.ceil((len(result) / 10)))):
            temp_result = result[i * 10: (i + 1) * 10]
            print(' '.join(map(str, temp_result)))'알고리즘 > 힙' 카테고리의 다른 글
| [Python] 백준 2841 외계인의 기타 연주 (0) | 2023.03.25 | 
|---|---|
| [Python] 백준 7662 이중 우선순위 큐 (0) | 2023.01.23 | 
| [Python] 백준 2109 순회강연 (0) | 2023.01.20 | 
| 🧑💻 [Python] 백준 14235 - 크리스마스 선물 (0) | 2023.01.16 |