알고리즘
백준 16401번 과자 나눠주기 (JAVA)
박카스마시며코딩
2022. 5. 11. 16:33
https://www.acmicpc.net/problem/16401
16401번: 과자 나눠주기
첫째 줄에 조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN ≤ 1,
www.acmicpc.net
저는 이분탐색을 통해 문제를 해결하였습니다.
저는 mid값으로 몇개의 과자를 만들 수 있는지를 체크하고 이 개수가 사람의 수보다 큰지를 확인하여 크다면 start = mid +1 작다면 end = mid - 1 로 하여 최대로 길게 줄 수 있는 과자 길이를 찾았습니다.
시간복잡도 : O(n(log(n)*m)) (n은 최대 길이 , m은 입력의 크기)
package BOJ.binarysearch;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_16401 {
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 peopleCnt = stoi.apply(st.nextToken());
int snackCnt = stoi.apply(st.nextToken());
int[] snack = new int[snackCnt];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < snackCnt ; i++) {
snack[i] = stoi.apply(st.nextToken());
}
int result = binearySearch(snack,peopleCnt);
System.out.println(result);
}
private static int binearySearch(int[] snack, int peopleCnt) {
int end = 1_000_000_000;
int start = 0;
int result = 0;
while(start <= end){
int mid = (start+end)/2;
if(mid == 0){
break;
}
if(checkSnackLengthCnt(snack,mid) >= peopleCnt){
result = mid;
start = mid + 1;
}else{
end = mid - 1;
}
}
return result;
}
private static int checkSnackLengthCnt(int[]snack, int value){
int sum = 0;
for(int length : snack){
sum += length / value;
}
return sum;
}
}