알고리즘/코테 문제풀이
[백준] 01002. 터렛
최새벽
2024. 6. 15. 18:51
사용언어: Java
1002. 터렛
https://www.acmicpc.net/problem/1002
solved ac에서 기하학 파트 문제를 푼적이 없길래 도전
생각
원의 접점 개수를 구하는 문제인 건 금방 파악했으나, 해당 조건이 기억 안나서 하나하나 시도해보느라 조금 오래 걸렸다.
원 중심이 겹치는 경우
① 반지름 길이가 같은 경우: (겹치는 지점이 무수히 많음) -1
② 원 중심이 겹치나 반지름 길이가 다른 경우 : 0
원 중심이 겹치지 않는 경우
원 안에 원이 있는 경우
③ 두 중심 사이 거리가 각 원의 반지름 길이 차보다 작은 경우 : 0
④ 두 중심 사이 거리가 각 원의 반지름 길이 차와 같을 경우 : 1
원 밖에 원이 있는 경우
⑤ 두 중심 사이 거리가 각 원의 반지름 길이 합보다 클 경우 : 0
⑥ 두 중심 사이 거리가 각 원의 반지름 길이 합과 같을 경우 : 1
⑦ 그 외 : 2
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class C01002 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String[] tempArr = br.readLine().split(" ");
int x1 = Integer.parseInt(tempArr[0]);
int y1 = Integer.parseInt(tempArr[1]);
int r1 = Integer.parseInt(tempArr[2]);
int x2 = Integer.parseInt(tempArr[3]);
int y2 = Integer.parseInt(tempArr[4]);
int r2 = Integer.parseInt(tempArr[5]);
// 거리 구할 때 원래 제곱근 해줘야 하지만 그냥 다른 비교 숫자를 제곱 해줌
double distSquared = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
double rSumSquared = (r1 + r2) * (r1 + r2);
double rDiffSquared = (r1 - r2) * (r1 - r2);
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
System.out.println(-1); // 두 원이 겹치는 경우 -> 접점 무한대
} else {
System.out.println(0); // 두 원의 중심이 같으나 반지름 길이가 다른 경우 -> 접점 x
}
} else {
if (distSquared > rSumSquared || distSquared < rDiffSquared) {
System.out.println(0); // 두 원 중심 사이의 거리가 반지름의 길이 합보다 크거나(원안에 원x),
// 두 원 중심 사이 거리가 반지름 길이 차보다 작을 경우(원 안에 원이 있음)
} else if (distSquared == rSumSquared || distSquared == rDiffSquared) {
System.out.println(1); // (원 안에 원x) 중심 거리와 반지름 합이 같음, (원 안의 원) 중심 거리와 반지름 차가 같음
} else {
System.out.println(2);
}
}
}
}
}