코딩테스트/Java

[JAVA] 백준 과자 나눠주기

SK_MOUSE 2022. 2. 2. 01:44
반응형

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

 

이분탐색 문제였다.

처음에는 Priority Queue로 각각의 경우를 나눠주는 방식으로 접근했지만, 아래 예시와 같은 경우를 따지려니 실패하였다.

 

ex) 3명의 조카에게 1개의 과자 3cm인 경우=> 3등분 해야함.

 

따라서 위 방식은 잘못되었음을 깨닫고 이분탐색 방식으로 진행해야했다.

 

 

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

public class Main {
    static int[] arr;
    static int m, n,result;

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

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(arr);
        binarySearch(1, arr[n-1]);

        System.out.println(result);
    }

    public static void binarySearch(int start, int end) {
        if(start>end) return;
        int mid = (start+end)/2;
        int cnt= 0;
        for (int i = 0; i < n; i++) cnt+= arr[i]/mid;

        if(cnt >= m) {//오른쪽
            if(result < mid) result=mid;
            binarySearch(mid+1, end);
        }else{//왼쪽
            binarySearch(start, mid-1);//왼쪽
        }

    }
}

테스트케이스 예시

3 10
1 2 3 4 5 6 7 8 9 10

 

첫번째시행-> 우측-> 우측-> 좌측(start>end이므로 종료) 
start = 1
end = 10
mid: 5
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 1
cnt = 2
cnt = 3
cnt = 4
cnt = 5
cnt = 7
start = 6
end = 10
mid: 8
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 1
cnt = 2
cnt = 3
start = 9
end = 10
mid: 9
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 0
cnt = 1
cnt = 2
start = 9
end = 8

----------------
result : 8

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 백준 수강신청  (0) 2022.02.09
[JAVA] 백준 감소하는 수  (0) 2022.02.06
[JAVA] 백준 가장 긴 증가하는 수열  (0) 2022.01.10
[JAVA] 백준 구간 합 구하기 5  (0) 2021.12.21
[JAVA] 백준 돌다리  (0) 2021.12.21