[BOJ 2110] 공유기 설치
업데이트:
문제
- BOJ 2110
- 문제의 저작권은 Baekjoon Online Judge에 있습니다.
접근방식
- 인접한 두 공유기 사이의 최대 거리를 mid로 두고 이분탐색을 한다.
- 집 거리가 저장된 배열에서 mid로 몇개의 공유기를 설치할 수 있는지 구한다.
- 만약 설치된 공유기 개수가 설치해야 하는 공유기 수(C)보다 적다면 거리를 더 좁게, 많다면 거리를 더 넓게 해서 다시 1로 돌아가 mid값을 구해준다. C개를 설치했더라도 더 긴 최대 거리가 존재할 수 있으므로 탐색해준다.
left==right
가 되면 탐색이 종료되고 이때의 값이 인접한 두 공유기 사이의 최대 거리가 된다.
코드
import java.util.Arrays;
import java.util.Scanner;
//공유기설치
public class Main {
static int N,C; //집, 공유기 개수
static int[] houses; //집 거리 배열
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); //집 개수
C = sc.nextInt(); //공유기 개수
houses = new int[N]; //집 거리 배열
for(int i = 0; i < N; i++) houses[i] = sc.nextInt(); //End input
Arrays.sort(houses); //거리순 오름차순 정렬
int left = 1; //가장 인접한 두 공유기 최소거리
int right = houses[N-1] - houses[0]; //최대거리
int mid = 0;
while(left <= right) {
int cnt = 1; //설치한 공유기 개수
int prev = houses[0]; //방금 설치한 집의 거리
mid = (left + right) / 2; //중간값 => 설치 거리
for(int house : houses) {//공유기 설치할 집 탐색
if(prev + mid <= house) { //방금 설치한 집의 거리+설치 거리보다 크면 설치가능
cnt++;
prev = house;
}
}
if(cnt >= C) left = mid + 1; //공유기가 더 많이 설치됐으므로 간격 더 넓게
else right = mid - 1;
}
System.out.print(right);
}
}