Algorithm
백준
구간 나누기 2

구간 나누기 2

https://www.acmicpc.net/problem/13397 (opens in a new tab)

풀이

public class Main {
    static int n, m, MAX = 987654321;
    static int[] arr;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        m = Integer.parseInt(s[1]);
 
        arr = new int[n];
 
        int right = Integer.MIN_VALUE;
        String[] s1 = br.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(s1[i]);
            right = Math.max(arr[i], right);
        }
 
        int left = 0;
 
        while (left < right) {
            // mid는 최대 크기가 몇이 넘지 않는 선까지 쪼갤지를 의미
            int mid = (left + right) / 2;
            if (solve(mid) <= m) { // m보다 카운트가 작으면 더 잘개 쪼갤 수 있음
                right = mid;
            } else { // m보다 count가 크면 더 큰 덩어리로 쪼개야함
                left = mid + 1;
            }
        }
 
        System.out.println(right);
    }
 
    private static int solve(int mid) {
        int count = 1;
        int min = MAX;
        int max = -MAX;
        for (int i = 0; i < n; i++) {
            min = Math.min(min, arr[i]);
            max = Math.max(max, arr[i]);
            if (max - min > mid) { // 지금 설정한 mid 값에 부합하지 않으면
                count++; // 구간 나눔
 
                // 재탐색을 위한 초기화
                max = -MAX;
                min = MAX;
                i--;
            }
        }
        return count;
    }
}