https://www.acmicpc.net/problem/1002
백준 1002번 터렛 문제 링크입니다.
핵심
이 문제는 해석하면, 두 원의 접점의 개수를 찾는 것이다. 가장 먼저 개수가 무한대일 경우는 두 원의 중심이 같고, 반지름이 같은 경우이다. 그다음 접점이 없는 경우인데, 이는 아래와 같은 그림일 때이다.
이는 다른 원이 내부에 있을 때인데, 식으로 나타내면 (x1-x2)^2+(y1-y2)^2<(r1-r2)^2이다.
이는 두 점 사이의 거리가 각 원의 반지름의 합보다 클 때이다. 식으로 나타내면 (x1-x2)^2+(y1-y2)^2>(r1-r2)^2이다.
다음은 접점이 한 개일 때이다. 내접한다는 의미이고, 식은 (x1-x2)^2+(y1-y2)^2=(r1-r2)^2가 된다.
다음은 외접할 때인데, 식은 (x1-x2)^2+(y1-y2)^2<(r1+r2)^2이다.
이러한 조건을 만족하지 않는다면 접점은 2개이다.
정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
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());
System.out.println(tangent_point(x1, y1, r1, x2, y2, r2));
}
}
public static int tangent_point(int x1, int y1, int r1, int x2, int y2, int r2) {
int distance_pow = (int)(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
if(x1 == x2 && y1 == y2 && r1 == r2) {
return -1;
}
else if(distance_pow > Math.pow(r1 + r2, 2)) {
return 0;
}
else if(distance_pow < Math.pow(r2 - r1, 2)) {
return 0;
}
else if(distance_pow == Math.pow(r2 - r1, 2)) {
return 1;
}
else if(distance_pow == Math.pow(r1 + r2, 2)) {
return 1;
}
else {
return 2;
}
}
}
해설
x1, y1, r1, x2, y2, r2를 입력받고, 매서드 tangent_point로 간다.
distance_pow는 (x1-x2)^2 + (y1-y2)^2를 나타낸다.
중점이 같고 반지름도 같으면 -1을 리턴한다.두 원의 반지름 합보다 중점 간 거리가 더 길 때는 0을 리턴한다.원 안에 원이 있지만, 내접하지 않을 때는 0을 리턴한다.외접, 내접할 때는 1을 리턴한다.위의 조건을 만족하지 않으면 2를 리턴한다.
개선점이나 오류가 있다면 댓글 부탁드립니다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준]15650번 N과M(2) (java) (0) | 2022.07.16 |
---|---|
[백준]15649번 N과 M(1) (java) (0) | 2022.07.15 |
[백준]2477번 참외밭(java) (0) | 2022.07.13 |
[백준]7568번 덩치(java) (1) | 2022.07.12 |
[백준]2981번 검문(java) (0) | 2022.07.11 |