알고리즘
bj13397(구간 나누기2)-매개변수탐색
쥐4
2025. 3. 20. 20:00
https://www.acmicpc.net/status?user_id=wjdwlgh2000&problem_id=13397&from_mine=1
항상 느끼는 거지만, 분할 정복, 매개변수 탐색 같이 인덱스를 다루는 놈들이 가장 어렵다.
매개변수 탐색은 조금더? 라는 생각으로 start나 end 둘중 하나를 mid+1을 넣어가면서 탐색해야한다.
마지막에는 그냥 mid였던 놈을 반환한다.
start = mid+1이었다면 end를 반환해주면 된다.
문제 이해는 쉬웠지만, 항상 구현에서 막힌다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static int[] arr;
static StringTokenizer stringTokenizer;
static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int init = initialize();
System.out.println(findMin(0, init));
}
private static int findMin(int start, int end) {
while(start < end){
int mid = (start + end) / 2;
if(divide(mid) > M){
start = mid+1;
continue;
}
end = mid;
}
return end;
}
private static int divide(int value) {
int max = 0, min = Integer.MAX_VALUE;
int cnt = 1;
for(int i = 0; i < N; i++){
max = Math.max(arr[i], max);
min = Math.min(arr[i], min);
if(max - min > value){
cnt++;
max = 0;
min = Integer.MAX_VALUE;
i--;
}
}
return cnt;
}
private static int initialize() throws IOException {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
arr = new int[N];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int max = 0;
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(stringTokenizer.nextToken());
max = Math.max(max, arr[i]);
}
return max;
}
}