알고리즘

백준 1417번 국회의원 선거 (JAVA)

박카스마시며코딩 2022. 5. 15. 17:35

https://www.acmicpc.net/problem/1417

 

1417번: 국회의원 선거

첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같

www.acmicpc.net

 

저는 해당 문제를 우선순위 큐를 이용해 해결하였습니다.

다솜이는 기호 1번이기 때문에 첫번째 입력은 pq에 넣지 않고, 나머지는 pq에 넣었습니다.

pq를 꺼내면서 다솜이의 표수보다 높으면 다솜이의 값을 하나 올리고 pq의 앞 값을 하나 줄이고 다시 pq에 넣습니다.

위의 과정을 다솜이의 표수보다 작아질 때 까지 하며 이를 몇번 실행한 것인지를 출력하였습니다.

 

package BOJ.greedy;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.function.Function;

public class BOJ_1417 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(br.readLine());
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        int voteCnt = 0;
        for(int i = 0 ; i < n ; i++){
            if(i == 0){
                voteCnt = stoi.apply(br.readLine());
            }else{
                int num = stoi.apply(br.readLine());
                pq.offer(num);
            }
        }
        int result = 0;
        while(!pq.isEmpty()){
            if(voteCnt <= pq.peek()){
                result++;
                voteCnt++;
                pq.offer(pq.poll() -1);
            }else{
                break;
            }
        }
        System.out.println(result);
    }
}