Q 11973 Angry Cows (Silver)
๐ก ๋ฌธ์ ์์ฝ ๋ฐ ๋ถ์
์ผ์ง์ ์์ผ๋ก ๋์ฌ์ง ๊ฑด์ด ๋๋ฏธ๊ฐ ์๊ณ , x ์์น์ ์๋ ์ ํ ๋ง๋ฆฌ๊ฐ r๋งํผ์ ๋ฒ์๋ก ๊ฑด์ด๋ฅผ ๋จน๋๋ค. (x-r ~ x+r) ์ฃผ์ด์ง ๋ชจ๋ ๊ฑด์ด ๋๋ฏธ๋ฅผ ํ๊ดดํ๊ธฐ ์ํ ์ต์ ํ๊ดด๋ ฅ r ์ ๊ตฌํ์.
๐ก ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
โ ํต์ฌ ์์ด๋์ด : ์ด๋ถ ํ์์ผ๋ก ํ ์ ์๋ค. ๋ฌธ์ ์์๋ ์ต์ ํ๊ดด๋ ฅ r ์ ๋ํด์๋ง ๋ฌป๊ณ ์์ผ๋ฏ๋ก x ๊น์ง ์ฐพ์๋ผ ํ์๋ ์๋ค.
์ ๋ ฅ
- ํ์ค์ ๋ ฅ์ผ๋ก int N, int K ์ ์ฅํ๋ค.
- ํ์ค์ ๋ ฅ์ผ๋ก ๊ฑด์ด ๋๋ฏธ์ ์์น๋ฅผ int[N] bales ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
์ฐ์ฐ
- left = 0, right = bales[N-1]
- ์ค๊ฐ๊ฐ mid๋ฅผ ๊ณ์ฐํ๋ค.
mid = (left + right) / 2
- ๊ณ์ฐ์ ์ํ x, count ๊ฐ์ ์ธํ
ํ๋ค.
x = bales[0] + mid;
x = ์์ ์์น๋ก, (x - mid ~ x + mid) ๋ฒ์๋ฅผ ์ฒดํฌํ๊ฒ ๋ ๊ฒ์ด๋ค. count ๋ณ์๋ ์๊ฐ ๋ช ๋ง๋ฆฌ ํ์ํ์ง ์ธ๊ธฐ ์ํด ํ์ํ๋ค. ((x - mid) <= bales[i] && balse[i] <= (x + mid))
๋ฒ์์ ๊ฐ์ ์ฒดํฌํ๋ค. ์ ์กฐ๊ฑด์ ํฌํจ๋์ง ์๋ else ์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฒซ ๋ฒ์งธ ์์ ํ๊ดด ๋ฒ์๋ฅผ ๋์ด์ ๊ฒ์ด๋ฏ๋ก ์๋ก์ด x๋ฅผ ์ธํ ํ๊ณ count++ ํ๋ค.- ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
count > K : left = mid + 1;
count <= K : right = mid - 1; result = mid;
์ถ๋ ฅ
- result ๋ณ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ก ์ฝ๋
import java.util.Arrays;
public class Main {
static int read() throws Exception {
int c = 0, n = 0;
while ((c = System.in.read()) > 47) n = (n << 3) + (n << 1) + (c & 15);
return n;
}
public static void main(String[] args) throws Exception {
int N = read();
int K = read();
int[] bales = new int[N];
for (int i = 0; i < N; i++) {
bales[i] = read();
}
Arrays.sort(bales);
int left = 0;
int right = bales[N - 1];
int result = 0;
while (left <= right) {
int mid = (left + right) / 2;
int x = bales[0] + mid;
int count = 1;
for (int i = 0; i < N; i++) {
if ((x - mid) <= bales[i] && bales[i] <= (x + mid)) {
// ์๋ฌด๋ฐ ์์
๋ ํ์ง ์์
} else {
x = bales[i] + mid;
count++;
}
}
if (count > K) {
left = mid + 1;
} else {
right = mid - 1;
result = mid;
}
}
System.out.println(result);
}
}
๐ก ์๊ฐ ๋ณต์ก๋, ๊ณต๊ฐ ๋ณต์ก๋
์๊ฐ ๋ณต์ก๋ | ๊ณต๊ฐ ๋ณต์ก๋ |
---|---|
O(n * log max) | O(n) |