알고리즘

백준 23757번 아이들과 선물 상자 (JAVA)

박카스마시며코딩 2022. 8. 27. 18:03

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

 

23757번: 아이들과 선물 상자

모든 아이들이 실망하지 않고 각자 원하는 만큼 선물을 가져갈 수 있으면 $1$을, 그렇지 않으면 $0$을 출력한다.

www.acmicpc.net

 

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

저는 우선순위 큐를 제일 높은 값이 앞으로 오도록 하여 이 값이 현재 들어온 값 즉, 아이들의 원하는 선물의 수보다 큰지 작은지를 비교하였습니다.

작다면 바로 0을 출력하도록 구현하였고, 높다면 우선순위 큐에 꺼내어 아이가 원하는 선물의 수를 빼고 다시 우선선위 큐에 넣어 모든 아이들이 원하는 선물을 가져갈 수 있는지를 확인하였습니다.

 

package BOJ.greedy;

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

public class BOJ_23757 {
    private static final int SUCCESS = 1;
    private static final int FAIL = 0;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < n ; i++){
            int num = stoi.apply(st.nextToken());
            pq.offer(num);
        }
        st = new StringTokenizer(br.readLine());
        int flag = SUCCESS;
        for(int i = 0 ; i < m ; i++){
            int num = stoi.apply(st.nextToken());
            if(pq.peek() >= num){
                pq.offer(pq.poll() - num);
            }else{
                flag = FAIL;
                break;
            }
        }
        System.out.println(flag);
    }
}