문제출처: https://www.acmicpc.net/problem/1002
x1, y1, r1, x2, y2, r2 라는 좌표가 주어지는데
r1, r2 는 거리를 나타낸다
(x1,y1)에서 r1의 거리와 (x2, y2)에서 r2의 거리 안에 서로 겹쳐지는 좌표가 몇개 있는지 구하는 문제이다
URI | 예제입력 | 예제 출력 |
---|---|---|
test case 1 | 3 0 0 13 40 0 37 0 0 3 0 7 4 1 1 1 1 1 5 | 2 1 0 |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int total = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int r1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
int r2 = Integer.parseInt(st.nextToken());
if (x1 == x2 && y1 == y2 && r1 == r2)
sb.append(-1).append("\n");
else if (x1 == x2 && y1 == y2 && r1 != r2)
sb.append(0).append("\n");
else {
double abs = Math.sqrt(Math.pow(Math.abs(x1 - x2), 2) + Math.pow(Math.abs(y1 - y2), 2));
if (abs < (double) (r1 + r2)) {
if (Math.abs(r1 - r2) == abs)
sb.append(1).append("\n");
else if (Math.abs(r1 - r2) > abs)
sb.append(0).append("\n");
else
sb.append(2).append("\n");
} else if (abs == (double) (r1 + r2))
sb.append(1).append("\n");
else
sb.append(0).append("\n");
}
}
System.out.println(sb);
br.close();
}
}
문제를 처음에 잘못 접근했었어서 시간이 다소 오래걸렸지만,
피타고라스의 정리를 이용하면 된다는걸 알면 생각보다 간단한 문제이다.
(x1, y1) 과 (x2, y2)의 거리를 √(a^2 + b^2)를 이용해서 더한후 주어진 거리인 r1, r2의 거리를 더한후 두 길이를 비교하여 리턴할 값을 구하면 된다. 가능한 결과 값은 2, 1, 0, ∞ 이다. 무한대의 경우 -1을 리턴하라고 나와 있기 때문에 2, 1, 0, -1의 경우의 수를 이제 if문으로 처리 해주어야 하는데,
∞의 경우
x, y 좌표가 서로 같고 거리도 같을때
1의 경우
서로 1개의 접점을 가질때 인데 두가지 경우가 있다.
2의 경우
(x1, y1)과 (x2, y2)의 거리보다 주어진 두 거리(r1, r2)의 합이 클때
0의 경우
나는 이정도 나누어 풀었다. 생각보다 if문 처리가 시간이 오래 걸렸는데, 쉬운것 같으면서도 은근히 신경써야될게 많은 문제였다.