문제는 다음과 같다.
이 문제에서는 거리를 맨해튼거리로 계산하기 때문에 조금 더 난이도가 쉬운편!
각 플랫폼에서 맨해튼거리로 L 보다 같거나 작은 거리 내 동물들을 다 잡을 수 있다고 가정했을 때
잡을 수 있는 모든 동물의 수를 구하는 문제이다!
플랫폼의 수를 M, 동물의 수를 N, 거리를 L이라고 둔다.
플랫폼의 y좌표는 어짜피 0이므로, 플랫폼의 x좌표를 저장할 배열을 만들어준다. 값을 입력받고 오름차순 정렬해준다.
Long[] plate = new Long[M];
...
Arrays.sort(plate);
이렇게 된다면 plate[0] 에는 x축에 가장 가까운 사대가, plate[plate.length-1]에는 x축에서 가장 먼 사대가 되는 것이다.
동물의 x, y좌표를 입력받으면서
plate를 기준으로 start값과 end 값을 잡아준다.
가장 초기에는 start는 0, end는 plate.length-1로 둔다.
mid값은 (start + end)/2 이다.
이분탐색을 돌며 plate[mid]에서 해당 동물의 거리를 구하고, 그 값을 기준으로
1. L과 같거나 작으면 답을 추가한다.
2. L보다 크다면 ...
// 모든 사대는 y의 값이 0이다. 따라서 맨해튼 거리를 구할 때 mid값이 바뀌어도 x좌표끼리의 값만 바뀌지, y 값은 항상 일정하다.
2-1. plate[mid] - x가 0보다 크다면, L과 같거나 작게 만드려면 plate[mid] 의 값이 줄어들어야된다. 따라서 mid값을 줄이기 위해 end값을 mid - 1 로 바꾼다.
2-2. plate[mid] - x가 0보다 작다면, plate[mid] 값은 항상 양수기때문에 값이 커져야된다. 따라서 start값을 mid + 1로 바꾼다.
이렇게 이분탐색을 시행하면 문제가 풀린다!
이분탐색을 들어가기 전
동물의 y값이 L보다 이미 큰 상태라면 -> 모든 동물이 다 포함될 수 없으므로 이분탐색 하지말고 바로넘긴다!
이거까지 하면 실행속도가 더 줄어든다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int M = Integer.parseInt(st.nextToken()),
N = Integer.parseInt(st.nextToken()),
L = Integer.parseInt(st.nextToken());
Long[] plate = new Long[M];
st = new StringTokenizer(bf.readLine());
for(int i=0;i<M;i++) {
plate[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(plate);
int ans = 0;
for(int i=0;i<N;i++) {
st = new StringTokenizer(bf.readLine());
Long x = Long.parseLong(st.nextToken()), y = Long.parseLong(st.nextToken());
int start = 0, end = M-1;
if(y > L) continue;
while(start <= end) {
int mid = (start+end)/2;
Long target = plate[mid] - x;
Long distance = Math.abs(target) + y;
if(distance <= L) {
ans++;
break;
} else if(target > 0) {
end = mid - 1;
} else {
start = mid + 1;
}
}
}
System.out.println(ans);
}
}
'Algorithm' 카테고리의 다른 글
[boj] 양치기꿍_3187 JAVA (1) | 2024.10.07 |
---|---|
[boj] 좋은수열_2661 JAVA (0) | 2024.09.30 |
[boj] 최소 편집_15483JAVA (0) | 2024.09.16 |
[boj] 수업시간에 교수님 몰래 교실을 나간 상근이_2825 JAVA (4) | 2024.09.08 |
[boj] RGB거리 2_17404 JAVA (0) | 2024.09.01 |