문제 요약
- x 축에 사대가 있고 (a,b)에 동물이 존재함 사대로부터 거리가 L 이하인 동물만 잡을 수 있다고 가정했을 때 잡을 수 있는 동물의 수 찾기
- 사대의 위치 x와 동물의 위치 (a, b) 간의 거리는 |x-a| + b
풀이
- 동물들의 위치를 기준으로 반복문으로 돌림
- 해당 동물을 잡을 수 있는 사대는
y좌표 - (L-x좌표)
부터y좌표 + (L-x좌표)
- 사대의 위치를 정렬하여 min 값보다 크거나 같은 사대의 idx를 구함 (lowerbound)
- 해당 idx의 사대 위치가 min 이상 max 이하일 경우 정답에서 1 증가
- 또 또 또 블로그 글을 보고 힌트를 얻은,,, ㅠㅠ
- 어차피 min의 값보다 같거나 큰 gun의 위치를 찾는 건데
if (gun[idx] <= max)
로만 하면 틀리고if (gun[idx] >= min && gun[idx] <= max)
해야 통과한다 이유가 뭐지...
더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int L = Integer.parseInt(st.nextToken());
int[] gun = new int[M];
int[][] animal = new int[N][2];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++) {
gun[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 2; j++) {
animal[i][j] = Integer.parseInt(st.nextToken());
}
}
Arrays.sort(gun);
int answer = 0;
for (int i = 0; i < N; i++) {
if (L < animal[i][1])
continue;
int min = animal[i][0] - (L - animal[i][1]);
long max = animal[i][0] + (L - animal[i][1]);
int idx = lowerBound(gun, min > 0 ? min : 0);
if (gun[idx] >= min && gun[idx] <= max)
answer++;
}
System.out.println(answer);
}
private static int lowerBound(int[] gun, int target) {
int l = 0;
int r = gun.length - 1;
while (l < r) {
int mid = (l + r) / 2;
if (gun[mid] < target)
l = mid + 1;
else
r = mid;
}
return l;
}
}
'알고리즘왕 > BOJ' 카테고리의 다른 글
[JAVA/백준/17940] 지하철 (0) | 2021.01.18 |
---|---|
[JAVA/백준/20437] 문자열 게임 2 (0) | 2021.01.17 |
[백준/1193/JAVA] 분수찾기 (0) | 2020.03.18 |
[백준/2292/JAVA] 벌집 (0) | 2020.03.18 |
[백준/2839/JAVA] 설탕 배달 (0) | 2020.03.18 |