어린왕자
백준 [1004] 어린왕자
풀이
모든 행성을 돌며 출발점과 도착점이 포함되는지 파악한다.
- 두 점이 모두 행성계에 포함되지 않는 경우 : 진입할 필요 없음
- 두 점이 모두 행성계에 포함되는 경우 : 진입할 필요 없음
- 두 점 중 한 점만 행성계에 포함되는 경우 : 진입 필요
소스코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 0; tc < T; tc++) {
// 출발점
int departureX = sc.nextInt();
int departureY = sc.nextInt();
// 도착점
int arrivalX = sc.nextInt();
int arrivalY = sc.nextInt();
int n = sc.nextInt();
int[][] planets = new int[n][3]; // 행성계
for (int i = 0; i < n; i++) {
for (int j = 0; j < planets[i].length; j++) {
planets[i][j] = sc.nextInt();
}
}
countPlanetsBoundary(departureX, departureY, arrivalX, arrivalY, planets);
}
}
private static void countPlanetsBoundary(int departureX, int departureY, int arrivalX, int arrivalY, int[][] planets) {
int n = planets.length;
int planetBoundaryCnt = 0;
for (int p = 0; p < n; p++) {
int planetX = planets[p][0];
int planetY = planets[p][1];
int planetR = planets[p][2];
double departureDistance = Math.sqrt(((departureX - planetX) * (departureX - planetX)) + ((departureY - planetY) * (departureY - planetY)));
double arrivalDistance = Math.sqrt(((arrivalX - planetX) * (arrivalX - planetX)) + ((arrivalY - planetY) * (arrivalY - planetY)));
// 출발점, 도착점 모두 현재 행성계에 포함되는 경우 -> 진입 할 필요 없음
if (departureDistance <= planetR && arrivalDistance <= planetR) {
continue;
}
if (departureDistance <= planetR || arrivalDistance <= planetR) {
planetBoundaryCnt++;
}
}
System.out.println(planetBoundaryCnt);
}
}