[백준] 2792: 보석 상자 - JAVA

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

풀이

M가지 보석을 N명의 학생들에게 나눠주어야한다.

보석을 받지 못하는 학생이 있어도 된다.

따라서 질투심을 몇 개로 할지를 변수로 두고 이분 탐색을 했다.

질투심을 mid로 했을 때 보석을 받는 학생의 수가 N보다 작으면 정답이 될 수 있다.

N보다 크면 left를 mid + 1로, 그렇지 않으면 right를 mid - 1로 좁혀가면서 탐색한다.


메모리: 34892KB

시간: 356ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int left = 1;
        int right = 0;
        int[] gem = new int[M];
        for (int i = 0; i < M; i++) {
            gem[i] = Integer.parseInt(br.readLine());
            right = Math.max(right, gem[i]);
        }

        int answer = 0;
        while (left <= right) {
            // 질투심이 mid가 되도록 나눠준다
            int mid = (left + right) / 2;

            // 보석을 받는 학생의 수가 N이하면 된다
            int cnt = 0;
            for (int i = 0; i < M; i++) {
                cnt += gem[i] / mid;
                if (gem[i] % mid != 0) {
                    cnt++;
                }
            }

            if (cnt > N) {
                left = mid + 1;
            } else {
                right = mid - 1;
                answer = mid;
            }
        }

        System.out.println(answer);
    }

}