알고리즘

백준 2792번 보석 상자 (JAVA)

박카스마시며코딩 2022. 3. 10. 13:19

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

 

2792번: 보석 상자

보석 공장에서 보석 상자를 유치원에 기증했다. 각각의 보석은 M가지 서로 다른 색상 중 한 색상이다. 원장 선생님은 모든 보석을 N명의 학생들에게 나누어 주려고 한다. 이때, 보석을 받지 못하

www.acmicpc.net

저는 해당 문제를 이분탐색으로 해결하였습니다.

이분탐색으로 mid값이 질투심을 만족하는지를 확인하였습니다.

보석의 개수를 mid값으로 나눠 이 값이 n보다 작은지를 확인하여 작다면 max 값을 줄여주고 , 크다면 min값을 늘리면서 최대 질투심을 구하였습니다.

package BOJ.BinarySearch;

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

public class BOJ_2792 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        String[] command = br.readLine().split(" ");
        int n = stoi.apply(command[0]);
        int m = stoi.apply(command[1]);
        int[] input = new int[m];
        for(int i = 0 ; i < m ; i++){
            input[i] = stoi.apply(br.readLine());
        }
        System.out.println(binarySearch(input,n,m));
    }

    private static int binarySearch(int[] input, int n, int m) {
        int result = Integer.MAX_VALUE;
        int max = 1_000_000_000;
        int min = 1;
        while(min <= max){
//            System.out.println(max+" "+min);
            int mid = (max+min)/2;
            int sum = 0;
            for(int i = 0 ; i < m ; i++){
                sum += input[i] / mid;
                if(input[i] % mid != 0){
                    sum++;
                }
            }
            if(sum > n){
                min = mid+1;
            }else{
                max = mid-1;
                result = mid;
            }
        }
        return result;
    }
}