백준
[백준] 2110 공유기 설치 [자바]
거북이같은곰
2021. 12. 31. 05:38
https://st-lab.tistory.com/277
[백준] 2110번 : 공유기 설치 - JAVA [자바]
https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에..
st-lab.tistory.com
https://www.acmicpc.net/board/view/74023
글 읽기 - 이분탐색 코드에서 왜 (count==C) 조건을 추가하면 안되는건가요?
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
https://www.acmicpc.net/board/view/68623
글 읽기 - 이분 탐색 조건
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static int[] router;
static int N;
static int C;
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());
C = Integer.parseInt(st.nextToken());
router = new int[N];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
router[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(router); //이분탐색 = 정렬
int lo = 1; //최소거리
int hi = router[N-1] - router[0] + 1; //최대거리도 탐색될 수 있게
while(lo < hi) {
int mid = (hi + lo) / 2; //거리
if(canInstall(mid) >= C) { //설치된 공유기가 C(설치해야하는 공유기 수) 보다 크면
lo = mid + 1; //최소 거리를 늘려준다
}
else {
//hi = mid-1;
hi = mid; //최소 거리를 줄여준다
}
}
System.out.println(lo - 1);
}
static int canInstall(int n) {
int count = 1;
int start = router[0];
for(int i = 1; i < N; i++) {
int locate = router[i];
if(locate - start >= n) { //최소 거리보다 크면
count++; //공유기를 설치함
start = locate; //공유기를 설치한 집 위치
}
}
return count;
}
}