알고리즘
백준 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;
}
}