[백준(Baekjoon)][자바(java)] 1004 : 어린 왕자 / 기하 1

728x90

 

https://www.acmicpc.net/problem/1004

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_1004 {
	
	public static double getDistance(int x1, int y1, int x2, int y2) {
		return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
	}

	public static void main(String[] args) throws Exception {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int t = Integer.parseInt(br.readLine());
		StringTokenizer st;
		int x_p[] = new int[2], y_p[] = new int[2], // start & end point
			n, x, y, r, cnt, i, j;
		boolean in_Circle[] = new boolean[2];
		StringBuilder sb = new StringBuilder();
		while (t-- > 0) {
			st = new StringTokenizer(br.readLine());
			for (i = 0; i < 2; ++i) {
				x_p[i] = Integer.parseInt(st.nextToken());
				y_p[i] = Integer.parseInt(st.nextToken());
			}
			n = Integer.parseInt(br.readLine());
			cnt = 0;
			for (i = 0; i < n; ++i) {
				st = new StringTokenizer(br.readLine());
				x = Integer.parseInt(st.nextToken());
				y = Integer.parseInt(st.nextToken());
				r = Integer.parseInt(st.nextToken());
				for (j = 0; j < 2; ++j)
					in_Circle[j] = getDistance(x_p[j], y_p[j], x, y) < r;
				if (in_Circle[0] && in_Circle[1])
					continue;
				for (j = 0; j < 2; ++j)
					if (in_Circle[j])
						cnt++;
			}
			sb.append(cnt + "\n");
		}
		br.close();

		System.out.println(sb.toString());
	}
}

 

출발점과 도착점이 각각 몇 개의 원 안에 있는지 카운트하여 더하면 됨
원 안에 둘러싸여 있으면 반드시 원 경계를 통과해야 하기 때문

단 출발점과 도착점이 모두 한 원 안에 있는 경우는 제외

 

 

반응형