728x90
코드 힌트
- 두 원의 중심이 같을 때:
- 반지름이 같을 경우: 두 원이 완전히 겹치며, 무한히 많은 교점이 존재할 수 있습니다. 이 경우 교점의 개수를 -1로 출력합니다.
- 반지름이 다를 경우: 두 원은 동심원이지만 겹치지 않으므로 교점이 없습니다. 이 경우 0을 출력합니다.
- 두 원의 중심이 다를 때:
- 원들이 서로 겹치지 않는 경우:
- 서로 떨어져 있는 경우: 두 원의 중심 사이의 거리 d가 두 원의 반지름 합 r1 + r2보다 크면, 원들은 겹치지 않으므로 교점이 없습니다.
- 한 원이 다른 원의 내부에 있지만 접하지 않는 경우: 두 원의 중심 사이의 거리 d가 큰 원의 반지름에서 작은 원의 반지름을 뺀 값보다 작으면, 교점이 없습니다.
- 원들이 한 점에서 접하는 경우:
- 외접: 두 원의 중심 사이의 거리 d가 두 반지름의 합과 같을 때 원들은 외접합니다. 이 경우 교점이 하나 있습니다.
- 내접: 두 원의 중심 사이의 거리 d가 큰 반지름에서 작은 반지름을 뺀 값과 같을 때 원들은 내접합니다. 이 경우도 교점이 하나 있습니다.
- 원들이 두 점에서 교차하는 경우: 중심 사이의 거리 d가 반지름 합보다 작고, 반지름 차이보다 클 때 두 원은 두 점에서 교차합니다. 이 경우 교점이 두 개 존재합니다.
- 원들이 서로 겹치지 않는 경우:
문제 풀 때 도움이 된 사이트 : https://houseofj.tistory.com/167
정답은 더보기 클릭
더보기
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
// BufferedReader와 BufferedWriter를 사용해 입출력 처리
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 테스트 케이스의 수를 입력 받음
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
// 각 테스트 케이스에서 두 원의 정보를 입력 받음
String[] arr = br.readLine().split(" ");
int x1 = Integer.parseInt(arr[0]); // 첫 번째 원의 중심 x좌표
int y1 = Integer.parseInt(arr[1]); // 첫 번째 원의 중심 y좌표
int r1 = Integer.parseInt(arr[2]); // 첫 번째 원의 반지름
int x2 = Integer.parseInt(arr[3]); // 두 번째 원의 중심 x좌표
int y2 = Integer.parseInt(arr[4]); // 두 번째 원의 중심 y좌표
int r2 = Integer.parseInt(arr[5]); // 두 번째 원의 반지름
// 두 원의 중심점 거리 distance
double d = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
// 두 원의 중심이 같은 경우
if (x1 == x2 && y1 == y2) {
// 두 원의 반지름이 같을 때: 무한히 많은 교점이 존재함
if (r1 == r2) {
bw.write("-1\n");
}
// 동심원이지만 반지름이 다를 때: 교점이 없음
else {
bw.write("0\n");
}
}
// 두 원의 중심이 다른 경우
else {
// 두 원이 서로 겹치지 않는 경우: 교점이 없음
if (r1 + r2 < d || Math.abs(r1 - r2) > d) {
bw.write("0\n");
}
// 두 원이 한 점에서 접하는 경우: 교점이 한 개
else if (r1 + r2 == d || Math.abs(r1 - r2) == d) {
bw.write("1\n");
}
// 두 원이 두 점에서 교차하는 경우: 교점이 두 개
else {
bw.write("2\n");
}
}
}
// BufferedWriter의 남은 데이터를 출력
bw.flush();
bw.close();
}
}
728x90
'백준' 카테고리의 다른 글
[백준] 단어 정렬 (1181번) (0) | 2024.08.17 |
---|---|
[백준] 나이순 정렬 (10814번) (0) | 2024.08.17 |
[백준] 스택 10828번 (0) | 2024.08.15 |
[백준] 별 찍기 - 3 (2440번) (0) | 2024.08.15 |
[백준] 피보나치 수 5 (10870번) (0) | 2024.08.15 |