문제를 꼼꼼히 봐야한다!
두가지를 간과해서 계속 틀림,,;;
처음에 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);
}
}
'스터디 > Algorithm' 카테고리의 다른 글
[백준] 경사로 14890 java - 구현 (0) | 2024.11.19 |
---|---|
[백준] DFS와 BFS 1260 java - dfs, bfs (0) | 2024.10.15 |
[백준] 괄호 추가하기 16637 java - dfs (0) | 2024.10.10 |
[백준] 여행 가자 1976 java - union find (4) | 2024.10.02 |
[프로그래머스스쿨] 체육복 java - greedy (0) | 2024.09.25 |