Question
문제 해설
- 도현이의 N개의 집은 수직선 위에 설치되어있음
- 집에 공유기 한대씩 설치해서, 총 C개의 공유기 설치하려고 함
- 공유기를 적당한 거리를 두고 각 집에 설치
- 적당한 거리 중 최대 값은?
Solution
풀이 접근 방법
- 공유기를 적당한 거리를 두고 설치
- 공유기간의 거리 차가 1, 2, 3, ... (최대) 일 때 각각 몇개의 공유기 설치 할 수 있는지 확인
- 거리 차 최소 : 1, 최대 : 가장 거리가 먼 집 - 가장 가까운 집
- 모든 경우의 수를 다 해보면 O(n2)
- 좀 더 효율적인 연산을 위해 이진 탐색 구현
정답 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class Main {
static int N, C;
static int[] home;
static int answer = -1;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] info = br.readLine().split(" ");
N = Integer.valueOf(info[0]);
C = Integer.valueOf(info[1]);
home = new int[N];
for (int i = 0; i < N; i++) {
home[i] = Integer.valueOf(br.readLine());
}
Arrays.sort(home);
binarySearch(1, home[N - 1] - home[0]);
bw.write(answer + "\n");
bw.flush();
bw.close();
}
static void binarySearch(int start, int end) {
if (start > end)
return;
int mid = (start + end) / 2;
int count = install(mid);
if (count >= C) {
answer = Math.max(answer, mid);
binarySearch(mid + 1, end);
} else if (count < C) {
binarySearch(start, mid - 1);
}
}
static int install(int interval) {
int flagHome = home[0];
int count = 1;
for (int i = 1; i < N; i++) {
if (flagHome + interval <= home[i]) {
count++;
flagHome = home[i];
}
}
return count;
}
}