두개의 좌표 (x1, y1) (x2, y2) 와 이 두 좌표로부터의 거리 r1, r2가 주어질 때
임의의 점 a (a, b) 가 존재할 수 있는 좌표의 수를 출력하는 문제이다.
계산을 편하게 하기 위해 두 점사이의 거리를 저장해두는 변수를 만들어준다.
int dis2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
제곱근을 구하려면 Math함수를 사용해야 하므로 피타고라스 공식을 이용하여 거리의 제곱을 저장해두자.
먼저 두 점과 r1, r2 가 일치할 때에는 a가 존재할 수 있는 좌표의 수는 무한대가 된다.
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
System.out.println(-1);
}
}
때문에 위와 같이 이 경우의 수는 -1로 고정시켜준다.
각 좌표로부터 떨어진 거리가 주어졌기 때문에 그림으로 그려보면 쉽게 이해할 수 있다.
이 외에 나올 수 있는 경우의 수는 다음과 같다.
만나지 않는 경우 (좌표가 0인 경우) 는 다음과 같다.
- 두 점이 서로 떨어져 있을 때
- 한 점에서 그린 원이 다른 점에서 그린 원을 포함할 때
- 두 좌표가 일치하지만 거리가 다를 때
만나는 경우는 다음과 같다.
- 두 원이 외접할 때 ( 1개의 좌표 )
- 두 원이 일부 겹칠 때 ( 2개의 좌표 )
- 두 원이 내접할 때 ( 1개의 좌표 )
따라서 if문을 이용하여 각 조건을 달아주면 된다.
위에서 두 좌표가 일치하는 조건이 있었으므로 r1 이 r2와 다른 조건을 추가해준다.
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
System.out.println(-1);
} else
System.out.println(0);
}
나머지 경우의 수는 두 점 사이의 거리와 비교하면 어떤 경우인지 알 수 있으므로 앞서 구했던 dis2를 이용하여 if문을 작성해준다.
if ((r1 + r2) * (r1 + r2) < dis2) {
System.out.println(0);
} else if ((r1 + r2) * (r1 + r2) == dis2) {
System.out.println(1);
} else {
if ((r1 - r2) * (r1 - r2) > dis2) {
System.out.println(0);
} else if ((r1 - r2) * (r1 - r2) == dis2) {
System.out.println(1);
} else
System.out.println(2);
}
전체 코드를 보면 다음과 같다.
import java.util.Scanner;
public class Back1002 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int x1, y1, r1, x2, y2, r2;
for (int i = 0; i < t; i++) {
x1 = sc.nextInt();
y1 = sc.nextInt();
r1 = sc.nextInt();
x2 = sc.nextInt();
y2 = sc.nextInt();
r2 = sc.nextInt();
int dis2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
System.out.println(-1);
} else
System.out.println(0);
} else {
if ((r1 + r2) * (r1 + r2) < dis2) {
System.out.println(0);
} else if ((r1 + r2) * (r1 + r2) == dis2) {
System.out.println(1);
} else {
if ((r1 - r2) * (r1 - r2) > dis2) {
System.out.println(0);
} else if ((r1 - r2) * (r1 - r2) == dis2) {
System.out.println(1);
} else
System.out.println(2);
}
}
}
}
}
다소 복잡한 방법으로 풀어서 코드가 길어진 감이 있다. Math.sqrt()함수를 이용하면 보다 짧고 간단하게 풀 수도 있을 듯 하다.
'Java > 백준알고리즘' 카테고리의 다른 글
[Java] 백준알고리즘 #2231 분해합 (0) | 2021.03.15 |
---|---|
[Java] 백준알고리즘 #2798 블랙잭 (0) | 2021.03.15 |
[Java] 백준알고리즘 #3053 택시 기하학 (0) | 2021.03.11 |
[Java] 백준알고리즘 #4153 직각삼각형 (0) | 2021.03.10 |
[Java] 백준알고리즘 #3009 네 번째 점 (0) | 2021.03.10 |