본문 바로가기

ProgramSoliving

백준 : 8983 사냥꾼

반응형

Y정렬을 생각하다가 가장 중요한걸 생각하지못해다.

 

문제의 아이디어는 Animal 의 x 위치기준으로 좌 우에 있는 사대만 검사하면된다.

 

이때 Animal을 x기준으로 정렬한다면 사대위치를 다시 뒤로 볼필요가없다.

 

따라서 Animal.x를 기준으로 왼쪽에서 가장 가까운 사대위치를 찾고 왼쪽사대와 오른쪽 사대 길이를 비교해서 반환한다.

 

package 삼성;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class 사냥꾼 {
	static class Map implements Comparable<Map> {
		long y;
		long x;

		public Map(long y, long x) {
			super();
			this.y = y;
			this.x = x;
		}

		@Override
		public int compareTo(Map o) {
			if (y > o.y) {
				return 1;
			} else if (y == o.y) {
				return Long.compare(x, o.x);
			}
			return -1;
		}
	}

	static TreeSet<Map> candidate = new TreeSet<>();
	static ArrayList<Map> animal = new ArrayList<>();
	static Map[] human;
	static int M, N;
	static long L;

	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 = Long.parseLong(st.nextToken());
		human = new Map[M];
		st = new StringTokenizer(br.readLine());

		for (int m = 0; m < M; m++) {
			human[m] = new Map(0, Long.parseLong(st.nextToken()));
		}
		Arrays.sort(human,new cmp());
		for (int n = 0; n < N; n++) {
			st = new StringTokenizer(br.readLine());
			long x = Long.parseLong(st.nextToken());
			long y = Long.parseLong(st.nextToken());
			if (y > L)
				continue;
			animal.add(new Map(y, x));
		}

		Collections.sort(animal, new cmp());

		int pivot = 0;

		// animal 후보군
		long ans = 0L;
		for (int n = 0; n < animal.size(); n++) {
			Map cur = animal.get(n);
			while (pivot + 1 < M && human[pivot + 1].x <= cur.x) {
				pivot++;
			}

			// 직전 피봇
			// 되면 ++
			if (Dis(human[pivot], cur) <= L) {
				ans++;
				continue;
			} else if (pivot + 1 < M && Dis(human[pivot + 1], cur) <= L) {
				ans++;
				continue;
			}
		}

		System.out.println(ans);

	}

	public static class cmp implements Comparator<Map> {

		@Override
		public int compare(Map o1, Map o2) {
			if (o1.x > o2.x) {
				return 1;
			} else if (o1.x == o2.x) {
				return Long.compare(o1.y, o2.y);
			}
			return -1;
		}

	}

	static long Dis(Map a, Map b) {

		return Math.abs(a.y - b.y) + Math.abs(a.x - b.x);
	}

}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 1400  (0) 2020.05.26
백준 : 16929  (0) 2020.05.26
백준 : 관중석(10166) JAVA  (0) 2020.05.24
백준 : 10800  (0) 2020.05.22
백준 : 17090 미로 탈출하기  (0) 2020.05.21