알고리즘

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