문제는 다음과 같습니다.
간단히 정리하면 두 원의 중심 (x1, y1), (x2, y2) 와 두 원의 반지름 r1, r2가 주어졌을 때 원의 접점의 개수를 출력하는 문제입니다.
접점의 개수가 무한대일 경우 -1을 출력합니다.
접점의 개수를 구하기 위해서는 세 가지 변수가 필요합니다.
-
distance : 두 원의 중심 사이의 거리
-
rsum : 두 원의 반지름의 합
-
rsub : 두 원의 반지름의 차의 절대값
이제 경우의 수를 살펴보겠습니다.
우선 두 원의 중심과 반지름이 모두 같은 경우에는 접점의 개수가 무한대입니다.
위 경우를 코드로 나타내면 distance == 0 && rsub == 0 입니다.
다음은 접점의 개수가 0개인 경우입니다.
위 경우를 코드로 나타내면 distance > rsum || distance < rsub 입니다.
다음은 접점의 개수가 1개인 경우입니다.
위 경우를 코드로 나타내면 distance == rsum || distance == rsub 입니다.
마지막으로 접점의 개수가 2개인 경우입니다.
위 경우를 코드로 나타내면 distance < rsum && distance > rsub 입니다.
위 내용들을 정리하면 다음과 같습니다.
-
distance == 0 && rsub == 0 -> -1
-
distance > rsum || distance < rsub -> 0
-
distance == rsum || distance == rsub -> 1
- distance < rsum && distance > rsub -> 2
다음은 코드입니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BOJ1002 {
public static double getDistance(int x1, int y1, int x2, int y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}
public static int getContactCount(double distance, int rsum, int rsub) {
if (distance == 0 && rsub == 0)
return -1;
if (distance > rsum || distance < rsub)
return 0;
if (distance == rsum || distance == rsub)
return 1;
return 2;
}
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
for (int i = 0; i < num; i++) {
String s[] = br.readLine().split(" ");
int x1 = Integer.parseInt(s[0]);
int y1 = Integer.parseInt(s[1]);
int r1 = Integer.parseInt(s[2]);
int x2 = Integer.parseInt(s[3]);
int y2 = Integer.parseInt(s[4]);
int r2 = Integer.parseInt(s[5]);
double distance = getDistance(x1, y1, x2, y2);
int rsum = r1 + r2;
int rsub = Math.abs(r1 - r2);
System.out.println(getContactCount(distance, rsum, rsub));
}
}
}
'Algorithm' 카테고리의 다른 글
[Leetcode / Javascript] 15. 3Sum (0) | 2021.06.23 |
---|---|
[Leetcode / Javascript] 14. Longest Common Prefix (0) | 2021.06.02 |
[백준] 9251번 : LCS (0) | 2019.08.22 |
[백준] 11054번 가장 긴 바이토닉 부분 수열 (0) | 2019.08.06 |