수학의 수 자도 싫어하는 나는 1004번을 열자마자 속이 메스꺼웠다.
대충 문제를 읽어보면, 출발점에서 도착점까지 행성들을 최소한으로 통과하는 선에서 이동할 건데 그 최소한의 통과 횟수를 구하란다.
처음 문제를 접하면 "이걸 어떻게 풀어" 라는 생각을 할 수 있다. 나는 수학의 수 자도 싫어하기 때문에, 이건 문제의 직관적인 해석으로는 절대 풀어나갈 수 없겠다고 직감이 왔다. 그리고 분명 다른 해석이 가능할 것이라고 생각했다. ※ 그리고 '문제'와 '결과' 의 연관성에 대한 다른 접근의 경우의 수들을 생각해보다가 곧이어 방법을 찾을 수 있었다.
이 문제는 "출발점 또는 도착점의 좌표를 품고 있는 원을 찾아라" 라고 다르게 생각해 볼 수 있다. 물론 이 때, 한 가지 예외의 경우가 생긴다. 바로 '원 안에 출발점과 도착점의 좌표가 모두 있는 경우'. 이 경우는 문제에서 행성을 통과하는 경우에 해당하지 않으므로 반드시 제외해줘야한다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int T = 0, n = 0, count = 0, start_x, start_y, end_x, end_y, a, b, r;
T = scanner.nextInt();
for(int i = 0; i < T; i++)
{
start_x = scanner.nextInt();
start_y = scanner.nextInt();
end_x = scanner.nextInt();
end_y = scanner.nextInt();
n = scanner.nextInt();
for(int j = 0; j < n; j++)
{
a = scanner.nextInt();
b = scanner.nextInt();
r = scanner.nextInt();
if(is_in(start_x, start_y, a, b, r)&&is_in(end_x, end_y, a, b, r))
continue;
if(is_in(start_x, start_y, a, b, r))
count++;
if(is_in(end_x, end_y, a, b, r))
count++;
}
System.out.println(count);
count = 0;
}
}
public static boolean is_in(int x, int y, int r_x, int r_y, int r_r)
{
return Math.pow(x-r_x, 2)+Math.pow(y-r_y, 2)<Math.pow(r_r, 2);
}
}
이 방법만 생각해 낸다면, 코딩은 쉽게 끝낼 수 있다.