๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

 

 

โœ๏ธSolution

 

์ด๋ถ„ ํƒ์ƒ‰(Binary Search) ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋Œ€ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค, ๋™๋ฌผ๋“ค์˜ ์œ„์น˜๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ L ์‚ฌ๊ฑฐ๋ฆฌ ๋‚ด์— ๋“ค์–ด์˜ค๋Š” ์‚ฌ๋Œ€๋ฅผ ์ฐพ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ์ง์˜ ์ˆœ์„œ๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  1. ์‚ฌ๋Œ€ ์œ„์น˜ ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
  2. ๋™๋ฌผ๋“ค์˜ ์ขŒํ‘œ๋ฅผ ์ˆœํšŒ
    • ํ˜„์žฌ ๋™๋ฌผ์˜ x ์ขŒํ‘œ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์‚ฌ๋Œ€์˜ ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ (y ์ขŒํ‘œ๋Š” ๊ณ ์ •๊ฐ’์ด๊ธฐ์— ์ƒ์ˆ˜๋กœ ํ•ญ์ƒ ์žˆ๋Š” ์ˆ˜)
    • ํƒ์ƒ‰ํ•œ ์‚ฌ๋Œ€์™€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ L ์ดํ•˜์ด๋ฉด ํƒ์ƒ‰ ์ข…๋ฃŒ
      • ์žก์„ ์ˆ˜ ์žˆ๋Š” ๋™๋ฌผ ์ˆ˜ +1ํ•˜๊ณ , ๋‹ค์Œ ๋™๋ฌผ ์ขŒํ‘œ๋กœ ์ˆœํšŒ
    • ํƒ์ƒ‰ํ•œ ์‚ฌ๋Œ€์™€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ L๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ํ˜„์žฌ ๋™๋ฌผ์˜ x ์ขŒํ‘œ์—์„œ ์‚ฌ๋Œ€๊ฐ€ ์™ผ์ชฝ์— ์žˆ๋Š”์ง€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š”์ง€ ํŒŒ์•…
      • ์‚ฌ๋Œ€๊ฐ€ ์™ผ์ชฝ์— ์žˆ๋‹ค๋ฉด left = mid + 1
      • ์‚ฌ๋Œ€๊ฐ€ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค๋ฉด right = mid - 1

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ปSource Code

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BOJ8983 {
    private static int M, N, L;
    private static long[] ShootingPositions;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1 << 16);
        String[] inputs = br.readLine().split(" ");

        M = Integer.parseInt(inputs[0]);
        N = Integer.parseInt(inputs[1]);
        L = Integer.parseInt(inputs[2]);

        inputs = br.readLine().split(" ");
        ShootingPositions = new long[M];

        for (int i = 0; i < M; i++) {
            ShootingPositions[i] = Long.parseLong(inputs[i]);
        }

        Arrays.sort(ShootingPositions);
        int answer = 0;

        for (int i = 0; i < N; i++) {
            inputs = br.readLine().split(" ");
            long x = Long.parseLong(inputs[0]), y = Long.parseLong(inputs[1]);

            answer += binarySearch(0, M - 1, x, y);
        }

        System.out.println(answer);
        br.close();
    }

    public static int binarySearch(int left, int right, long animalX, long animalY) {
        boolean canHunt = false;

        while (left <= right) {
            int mid = (left + right) / 2;
            long turretX = ShootingPositions[mid];
            long distance = Math.abs(turretX - animalX) + animalY;

            // ์‚ฌ๋ƒฅ ๊ฐ€๋Šฅํ•œ ๊ฑฐ๋ฆฌ์ด๋ฉด ์ด๋ถ„ ํƒ์ƒ‰ ์ค‘๋‹จ
            if (distance <= L) {
                canHunt = true;
                break;
            }

            if (turretX < animalX) left = mid + 1;
            else                   right = mid - 1;
        }

        return canHunt ? 1 : 0;
    }
}

728x90
๋ฐ˜์‘ํ˜•