Q 11973 Angry Cows (Silver)

๐Ÿ’ก ๋ฌธ์ œ ์š”์•ฝ ๋ฐ ๋ถ„์„

์ผ์ง์„ ์ƒ์œผ๋กœ ๋†“์—ฌ์ง„ ๊ฑด์ดˆ ๋”๋ฏธ๊ฐ€ ์žˆ๊ณ , x ์œ„์น˜์— ์žˆ๋Š” ์†Œ ํ•œ ๋งˆ๋ฆฌ๊ฐ€ r๋งŒํผ์˜ ๋ฒ”์œ„๋กœ ๊ฑด์ดˆ๋ฅผ ๋จน๋Š”๋‹ค. (x-r ~ x+r) ์ฃผ์–ด์ง„ ๋ชจ๋“  ๊ฑด์ดˆ ๋”๋ฏธ๋ฅผ ํŒŒ๊ดดํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ํŒŒ๊ดด๋ ฅ r ์„ ๊ตฌํ•˜์ž.

๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

โœ… ํ•ต์‹ฌ ์•„์ด๋””์–ด : ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” ์ตœ์†Œ ํŒŒ๊ดด๋ ฅ r ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฌป๊ณ  ์žˆ์œผ๋ฏ€๋กœ x ๊นŒ์ง€ ์ฐพ์•„๋‚ผ ํ•„์š”๋Š” ์—†๋‹ค.

  1. ์ž…๋ ฅ

    • ํ‘œ์ค€์ž…๋ ฅ์œผ๋กœ int N, int K ์ €์žฅํ•œ๋‹ค.
    • ํ‘œ์ค€์ž…๋ ฅ์œผ๋กœ ๊ฑด์ดˆ ๋”๋ฏธ์˜ ์œ„์น˜๋ฅผ int[N] bales ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
    • ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
  2. ์—ฐ์‚ฐ

    • 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;
  3. ์ถœ๋ ฅ

    • 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)