본문 바로가기

ALGORITHM

백준 8983 사냥꾼 (Java)

1. 문제 링크

 

8983번: 사냥꾼

입력의 첫 줄에는 사대의 수 M (1 ≤ M ≤ 100,000), 동물의 수 N (1 ≤ N ≤ 100,000), 사정거리 L (1 ≤ L ≤ 1,000,000,000)이 빈칸을 사이에 두고 주어진다. 두 번째 줄에는 사대의 위치를 나타내는 M개의 x-좌

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. 이분탐색을 위해 입력받은 사대의 위치들을 정렬한다.

2. 동물마다 이분탐색을 진행하여 사냥이 가능한지 확인한다.

3. 중간 사대 기준으로 해당 사대가 사정거리 내에 있는지 판단한다.

3-1. 사정거리 내에 있다면 true를 리턴한다.

3-2. 사정거리 밖인데 x좌표가 같은 경우 사냥이 불가능하기 때문에 false를 리턴한다.

3-3. 동물이 앞에 있으면 end 변수를 중간값보다 앞으로 바꿔 반복한다.

3-4. 동물이 뒤에 있으면 start 변수를 중간값보다 뒤로 바꿔 반복한다.

 

4. 코드

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

public class Main {
	static int M, L, gun[];
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		String[] split = br.readLine().split(" ");
		M = Integer.parseInt(split[0]);
		int N = Integer.parseInt(split[1]);
		L = Integer.parseInt(split[2]);
		
		split = br.readLine().split(" ");
		gun = new int[M];
		for(int i=0;i<M;i++) { //사대 위치
			gun[i] = Integer.parseInt(split[i]);
		}
		Arrays.sort(gun); //이분 탐색을 위해

		int result = 0, x = 0, y = 0;
		for(int i=0;i<N;i++) { //동물 위치
			split = br.readLine().split(" ");
			x = Integer.parseInt(split[0]);
			y = Integer.parseInt(split[1]);
			if(possible(x, y)) {
				result++;
			}
		}
		
		System.out.println(result);
	}
	
	private static boolean possible(int x, int y) {
		int start = 0;
		int end = M - 1;
		int mid = 0;
		int distance = 0;
		
		while(start <= end) {
			mid = (start+end)/2;
			distance = Math.abs(x-gun[mid])+y;
			
			if(distance <= L) { //사정거리 내
				return true;
			}
			
			//동물이랑 x좌표가 같은 경우
			if(x == gun[mid]) {
				return false;
			}
			
			//동물이 앞/뒤에 있는 경우
			if(x < gun[mid]) {
				end = mid - 1;
			}
			else if(x > gun[mid]) {
				start = mid + 1;
			}
		}
		
		return false;
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 1188 음식 평론가 (Java)  (0) 2023.09.01
백준 22945 팀 빌딩 (Java)  (0) 2023.07.09
백준 14938 서강그라운드 (Java)  (1) 2023.07.06
백준 2615 오목 (Java)  (0) 2023.07.05
백준 17218 비밀번호 만들기 (Java)  (0) 2023.07.04