[백준] 8983: 사냥꾼 - JAVA
https://www.acmicpc.net/problem/8983
풀이
x축에 사냥꾼들의 위치가 주어지고, 동물의 좌표가 x, y 좌표로 주어진다.
사냥꾼의 총의 사정거리가 주어지고, 동물을 몇 마리 잡을 수 있는지 구하는 문제이다.
동물을 기준으로 자신을 잡을 수 있는 사냥꾼이 있는지 판별했다.
동물의 위치로부터 사정거리 내에 있는 x축 위 점의 최소, 최대를 구한다. 이를 left, right로 하고 이분탐색을 통해 사냥꾼의 위치가 이 범위 안에 있는지 확인한다.
메모리: 55416KB
시간: 700ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static class Animal {
int x;
int y;
public Animal(int x, int y) {
this.x = x;
this.y = y;
}
}
static int m, n, l;
static int[] hunter;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
l = Integer.parseInt(st.nextToken());
hunter = new int[m];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < m; i++) {
hunter[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(hunter);
Animal[] animals = new Animal[n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
animals[i] = new Animal(x, y);
}
int answer = 0;
for (int i = 0; i < n; i++) {
answer += searchWhoCanHuntMe(animals[i]);
}
System.out.println(answer);
}
private static int searchWhoCanHuntMe(Animal animal) {
int start = 0;
int end = m - 1;
int left = animal.x - (l - animal.y);
int right = animal.x + (l - animal.y);
while (start <= end) {
int mid = (start + end) / 2;
if (hunter[mid] >= left && hunter[mid] <= right) {
return 1;
}
if (hunter[mid] < left) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return 0;
}
}