해결
이 문제를 해결하기 위해서는 공유기 설치 간격을 이분탐색으로 구하면 된다.
즉, 공유기 설치 간격을 정해서 입력받은 공유기의 수보다 공유기를 설치 못한다면 공유기 설치 간격을 줄이고
반대로, 입력받은 공유기 수와 같거나 더 많이 설치 가능하다면 공유기 설치 간격을 늘려가며 이분탐색을 진행한다.
예를 들어, 집은 1, 2, 4, 8, 9 에 위치하고 공유기는 3개를 설치하고 싶다고 가정하자.
집간 최소 간격은 1이고 최대 간격은 8이다.
따라서 start=1, end=8로 설정한다.
첫번째 mid= 4가 되고 이는 공유기 설치 간격은 4가 되는 것이다.
위 집들에 적용하면 1, 8에 설치 가능하다. 이는 공유기 3개보다 적으므로 설치 간격을 줄인다.
두번째로는 start=1, mid=2, end=3
위 집들에 적용하면 1, 4, 8에 설치 가능하다. 따라서 간격을 늘려 적용해본다.
세번째로는 start=3, mid=3, end=3
위 집들에 적용하면 1, 4, 8에 설치 가능하고 결과적으로 최대값은 3이되는 것이다.
코드
import java.util.*;
// 공유기 설치
public class Q3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 집의 수
int n = sc.nextInt();
// 공유기 수
int c = sc.nextInt();
// 집 위치 입력 받기
List<Integer> houses = new ArrayList<>();
for(int i=0; i<n; i++){
houses.add(sc.nextInt());
}
// 집 정렬
Collections.sort(houses);
// 공유기 설치 간격
// 최소 : 1, 최대 : 구하기
int start = 1;
int end = houses.get(n-1)-houses.get(0);
int result = 0;
while(start <= end){
// mid : 현재 공유기 설치 간격
int mid = (start+end)/2;
// 공유기 설치 시작점
int value = houses.get(0);
// 공유기 설치 수
int count = 1;
// 공유기 설치
for(int i=1; i<n; i++){
// 집이 기준 집+지정한 공유기 설치간격보다 넓다면
// 해당 집에 공유기 설치 후 기준 집 수정
if(houses.get(i) >= value+mid){
value = houses.get(i);
count += 1;
}
}
// 설치된 공유기 수가 입력받은 공유기 수보다 크다면 설치 가능
// 따라서 간격을 늘려서 다시 이분탐색
if(count >= c){
start = mid+1;
result = mid;
}
// 입력받은 공유기 수보다 작다면 설치 불가능
// 따라서 간격을 줄여서 다시 이분탐색
else{
end = mid-1;
}
}
// 결과 출력
System.out.println(result);
}
}
'Algorithm > Practice' 카테고리의 다른 글
이코테 - 효율적인 화폐 구성 with JAVA (0) | 2023.09.12 |
---|---|
Programmers - 가사 검색 with JAVA (0) | 2023.09.07 |
이코테 - 정렬된 배열에서 특정 수의 개수 구하기 (0) | 2023.09.05 |
이코테 - 안테나 with JAVA (0) | 2023.09.04 |
이코테 - 특정 거리의 도시 찾기 with JAVA (0) | 2023.08.16 |