20. 백준 1004번 어린 왕자

문제

어린 왕자는 소혹성 B-664에서 자신이 사랑하는 한 송이 장미를 위해 살아간다.
어느 날 장미가 위험에 빠지게 된 것을 알게 된 어린 왕자는, 장미를 구하기 위해 은하수를 따라 긴 여행을 하기 시작했다.
하지만 어린 왕자의 우주선은 그렇게 좋지 않아서 행성계 간의 이동을 최대한 피해서 여행해야 한다.
은하수 지도, 출발점, 도착점이 주어졌을 때 어린 왕자에게 필요한 최소의 행성계 진입/이탈 횟수를 구하는 프로그램을 작성해 보자.
행성계의 경계가 맞닿거나 서로 교차하는 경우는 없다. 또한, 출발점이나 도착점이 행성계 경계에 걸쳐진 경우 역시 입력으로 주어지지 않는다.

아이디어

행성계를 원으로 생각했을 때, 출발점과 도착점 중 하나가 원 안에 있으면 반드시 그 행성계를 지난다.
(그렇지 않으면 지나지 않는다.)

필요한 문법

Math.sqrt(double a) : double 값을 제곱근한 값을 반환
Math.pow(double a, double b) : a를 b제곱한 값 반환

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Scanner;
public class No1004 {
public static boolean inOrOut(int x1, int x2, int y1, int y2, int r){
if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r){
return true;
}
return false;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int testCase = sc.nextInt();
int[] x = new int[2];
int[] y = new int[2];
for (int i = 0 ; i < testCase ; i++){
x[0] = sc.nextInt();
y[0] = sc.nextInt();
x[1] = sc.nextInt();
y[1] = sc.nextInt();
int planetCount = sc.nextInt();
int result = 0;
for (int j = 0 ; j < planetCount ; j++){
int planetX = sc.nextInt();
int planetY = sc.nextInt();
int planetR = sc.nextInt();
if(inOrOut(x[0], planetX, y[0], planetY, planetR)){
if(!inOrOut(x[1], planetX, y[1], planetY, planetR)){
result += 1;
}
}
else{
if(inOrOut(x[1], planetX, y[1], planetY, planetR)){
result += 1;
}
}
}
System.out.println(result);
}
}
}
Share