CODE

백준 BOJ 1417 국회의원 선거

sed 2026. 4. 29. 10:48
SMALL

문제

 

코드

import sys
import heapq

input = sys.stdin.readline

n = int(input())
votes = [int(input()) for _ in range(n)]

dasom = votes[0]
heap = [-x for x in votes[1:]]
heapq.heapify(heap)

cnt = 0

while heap and dasom <= -heap[0]:
    top = -heapq.heappop(heap)
    
    top -= 1
    dasom += 1

    heapq.heappush(heap, -top)
    cnt += 1

print(cnt)

 

다솜이가 1번 후보이고, 나머지 후보들이 존재한다. 다솜이가 당선되려면 다른 모든 후보들의 표 보다 다솜이의 표가 커야 한다.

그러니 매수는 항상 현재 표가 가장 많은 후보의 지지자에게 해야한다.

 

한 번 매수 시

그 후보 표 -1
다솜 표 +1

 

따라서 다음과 같은 흐름으로 코드를 완성해야 한다.

가장 표 많은 후보를 찾는다
그 후보 표를 1 줄인다
다솜 표를 1 늘린다
이걸 다솜이 1등이 될 때까지 반복한다

 

이때, 파이썬의 heapq는 기본이 최소힙이기에 가장 작은 값이 나온다. 따라서 가장 큰 값이 필요하므로 음수로 넣는다.

votes = [5, 7, 7, 3]

dasom = votes[0]          # 5
heap = [-7, -7, -3]       # 나머지 후보를 음수로 저장

 

음수로 저장하면 실제 가장 큰 7이 -7이 되고, 힙에서는 -7이 -3보다 작으니까 먼저 나오게 된다. 따라서 최소 힙을 최대 힙처럼 사용한다.

 

 

-heap[0]은 현재 다른 후보 중 최다 득표 수이다. 

heap[0]는 -7 이므로 마이너스를 달아서 최다 득표 수 7로 만들어 준다.

while heap and dasom <= -heap[0]:

 

이는 다솜의 표가 현재 1등 후보 표 보다 작거나 같으면 계속 매수하라는 뜻이다.

 

이후 현재 제일 표 많은 후보를 꺼낸다.

top = -heapq.heappop(heap)

 

그 후보 표를 1개 줄이고 다솜 표를 1개 늘린다.

top -= 1
dasom += 1

 

줄어든 후보를 다시 힙에 넣어 다른 후보자보다 표가 많을 수도 있는 점을 대비한다.

heapq.heappush(heap, -top)

 

LIST

'CODE' 카테고리의 다른 글

백준 BOJ 2075 N번째 큰 수  (0) 2026.04.29
백준 BOJ 1202 보석 도둑  (0) 2026.04.29
백준 BOJ 11866 요세푸스 문제 0  (0) 2026.04.29
백준 BOJ 2164 카드2  (0) 2026.04.28
n진수 만들기  (0) 2026.04.24