구간 나누기 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;
}
}