mid를 중심으로 좌우 탐색을 반복하는 건 알겠으나 실제 구현이 막힌다면 아마도 참고할 만한 글
'탐색할 값' 과 '탐색할 범위' 이렇게 2개를 정해야 한다.
그리고 이분 탐색 로직을 생각한다.
※ 정렬, 타입(long)
import java.util.*;
import java.lang.*;
import java.io.*;
/*
9:48 ~ 10:28
1. 집 정렬
2. 탐색할 값 : 공유기 사이 거리 최대값
탐색 범위: 공유기 사이 거리 최소, 최대
최소: 1
최대: 가장 큰 집 - 가장 작은 집 = 9 - 1 = 8
가장 인접한 공유기 사이 거리가 d라면
d보다 더 작은 거리가 생기면 안됨
mid: 2
D: 1 2 4 1
H: 1 2 4 8 9
. . .
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int C = sc.nextInt();
long[] homes = new long[N];
for(int i = 0; i < N; i++) {
homes[i] = sc.nextLong();
}
Arrays.sort(homes);
long answer = 0;
long left = 1;
long right = homes[N-1] - homes[0];
while(left <= right) {
long mid = (left + right) / 2;
int cCnt = 1; // 공유기 설치 개수
int cIdx = 0; // 공유기가 마지막으로 설치된 인덱스
for(int i = 1; i < N; i++) {
long d = homes[i] - homes[cIdx];
if(d >= mid) { // 공유기 설치
cIdx = i;
cCnt++;
}
}
if(cCnt >= C) { // mid 키움
left = mid + 1;
answer = mid;
} else { // mid 줄임
right = mid - 1;
}
}
System.out.print(answer);
sc.close();
}
}
따라서 O(NlogN+NlogD) 가 최종 시간 복잡도이다.