Algorithm/Baekjoon
[Java] ๋ฐฑ์ค 2110๋ฒ - ๊ณต์ ๊ธฐ ์ค์น
๊ฐ๋ฐ๊ฐ๊ตด๐ธ
2022. 6. 28. 22:29
https://www.acmicpc.net/problem/2110
2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น
์ฒซ์งธ ์ค์ ์ง์ ๊ฐ์ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์ ๊ธฐ์ ๊ฐ์ C (2 ≤ C ≤ N)์ด ํ๋ ์ด์์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ง์ ์ขํ๋ฅผ ๋ํ๋ด๋ xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ
www.acmicpc.net
[๋ฌธ์ ]
[ํ์ด]
0๋ฒ์งธ์ง ~ N-1๋ฒ์งธ ์ง๊น์ง ์ด๋ถํ์์ ํตํด interval ๊ฐ์ ์ด์ฉํด ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ ์ ์๋์ง ํ์ธํ๋ฉฐ interval๊ฐ์ ๊ฐฑ์ ํฉ๋๋ค.
๋ง์ฝ ์ง์ ๋ฒํธ๋ค์ด 1 2 8 4 9 ์ด๊ณ ๊ณต์ ๊ธฐ๋ 3๊ฐ๋ฉด, ์ต๋๊ฐ์ (9-1) / 2 = 4์ ๋๋ค. ๋ง์ฝ 1~9๊ฐ ๋ชจ๋ ์ฑ์์ ธ ์๋ค๊ณ ์๊ฐํ๋ฉด
1 5 9๋ฅผ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- home[] ์ N๊ฐ์ ์ง ์์น๋ฅผ ์ ์ฅํฉ๋๋ค.
- ๊ณต์ ๊ธฐ ์ค์น ๊ฐ๊ฒฉ interval์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ตฌํ์ฌ left, right์ ์ ์ฅํฉ๋๋ค.
- ์ต์๊ฐ 1์ left์ ์ ์ฅํฉ๋๋ค.
- ์ต๋๊ฐ์ (home[N-1] - home[0]) / (C-1) ์ผ๋ก ๊ตฌํ์ฌ right์ ์ ์ฅํฉ๋๋ค.
- left์ right์ ์ค๊ฐ๊ฐ mid๋ฅผ interval๋ก ์ค์ ํ์ฌ wifi(mid)๋ฅผ ํตํด ํด๋น ๊ฐ์ ์ค์น ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ํ์ฌ, ์ค์นํ ์ ์๋ค๋ฉด left++ํ๊ณ ์๋ค๋ฉด right--๋ฅผ ํตํด mid๊ฐ์ ๊ฐฑ์ ํด๊ฐ๋ฉฐ ํ์ํฉ๋๋ค.
[์ฝ๋]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int C;
static int home[];
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());
home = new int[N];
for(int i=0;i<N;i++) {
home[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(home);
int start = home[0];
int end = home[N-1];
int left = 1;
int right = (end - start)/(C-1);
while(left <= right) {
int mid = (left + right)/2;
boolean find = wifi(mid);
if(find) {
left = mid + 1;
} else {
right = mid - 1;
}
}
System.out.println(right);
}
public static boolean wifi(int interval) {
int cnt = 1;
int index = 0;
int now = home[0] + interval;
while(cnt < C) {
if(now > home[N-1]) {
break;
}
for(int i=index + 1;i < N;i++) {
if(home[i] >= now) {
cnt++;
now = home[i] + interval;
index = i;
}
if(cnt == C) {
return true;
}
}
}
if(cnt == C) {
return true;
}
return false;
}
}