알고리즘(백준 등) 공부/백준(자바)

백준 1417번: 국회의원 선거

posite 2026. 4. 23. 14:51

선거를 위한 투표를 진행하여 가장 많은 표를 받은 후보가 당선이 된다. N명의 후보에게 각각 몇명이 투표를 할 지 정해져 있을 때,  1번 후보가 당선되기 위해 매수해야 할 사람의 수의 최솟값을 구하는 문제이다.

 

단일 후보라면 매수할 필요가 없다. 단일 후보가 아니라면 1번 후보가 득표수가 가장 많아질 때 까지 우선순위 큐를 사용하여 가장 많이 득표할 후보의 표를 1개씩 1번 후보가 매수한다.

PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
for (int i = 0; i < n - 1; i++) {
    pq.add(Integer.parseInt(br.readLine()));
}
int count = 0;
while (current <= pq.peek()) {
    current++;
    pq.add(pq.remove() - 1);
    count++;
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;

public class 국회의원선거1417 {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int current = Integer.parseInt(br.readLine());
        if (n == 1) {
            System.out.print("0");
            return;
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        for (int i = 0; i < n - 1; i++) {
            pq.add(Integer.parseInt(br.readLine()));
        }
        int count = 0;
        while (current <= pq.peek()) {
            current++;
            pq.add(pq.remove() - 1);
            count++;
        }
        System.out.print(count);
    }
}