[백준] 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);
}
}