스터디/Algorithm
[백준] 휴게소 세우기 1477 java - 이분탐색
혜유우
2024. 10. 14. 23:48
문제를 꼼꼼히 봐야한다!
두가지를 간과해서 계속 틀림,,;;
처음에 left, right 범위를 잘못 잡아줘서 계속 2N%..에서 틀림 ㅜㅜ
'이미 휴게소가 있는 곳에 휴게소를 또 세울 수 없고, 고속도로의 끝에도 휴게소를 세울 수 없다.'
라는 조건 때문에 최소와 최대를 left=1(0이면 x), right=L-1로 잡을 수 있다.
또한 개수를 세는 것이므로 -1을 해줘야 한다
처음에는 (arr[i+1]-arr[i])/mid로 해서 값이 잘 안나왔다 ..
만약 mid=200이라고 하고 arr[1]=200, arr[0]=0이라고 하면
cnt=1이 나오지만 최대값이 mid이므로 1개를 세울 수 없다..!
따라서 (arr[i+1]-arr[i]-1)/mid 로 cnt를 세줘야 한다
https://www.acmicpc.net/problem/1477
[내 풀이]
import java.io.*;
import java.util.*;
public class Main {
static int N, M, L;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
arr = new int[N+2];
st = new StringTokenizer(br.readLine());
arr[0] = 0;
arr[N+1] = L;
for(int i=1;i<N+1;i++){
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int left = 1;
int right = L-1;
int answer = 0;
while(left<=right){
int mid = (left+right)/2;
int cnt = 0;
for(int i=0;i<N+1;i++){
cnt += (arr[i+1]-arr[i]-1)/mid;
}
if(cnt>M){
left = mid+1;
} else {
right = mid-1;
answer = mid;
}
}
System.out.println(answer);
}
}