문제 & 링크
https://www.acmicpc.net/problem/1002
풀이
1. x1, y1을 중심으로 하고 반지름이 r1인 원과 x2, y2를 중심으로 하고 반지름이 r2인 원의 접점을 구하는 문제이다.
2. 두 원의 중심 좌표가 같을 경우 반지름의 길이가 같다면 접점은 무한대가 되고, 다르다면 접점은 없게 된다.
3. 두 원의 중심 좌표가 다를 경우 접점이 두 개, 한 개, 없는 경우로 나뉜다.
3-1. 접점이 두 개인 경우는 중심 좌표 간의 거리가 각 원의 반지름의 합보다는 짧고, 반지름의 차보다는 긴 경우이다.
3-2. 접점이 한 개인 경우는 중심 좌표 간의 거리가 각 원의 반지름의 합과 같거나 반지름의 차와 같은 경우이다.
3-3. 접점이 없는 경우는 그 외의 경우이다.
참고 자료
빨간색 선: r1, 파란색 선: r2, 초록색 선: 중심 좌표 간의 거리
두 case 모두 한 점에서 만나는 경우이다.
case 1에서 중심 좌표 간의 거리가 가까워지면 두 점에서 만나게 되고, 멀어지면 접점이 없어진다.
case 2에서 중심 좌표 간의 거리가 가까워지면 접점이 없어지고, 멀어지면 두 점에서 만나게 된다.
정리
두 점에서 만나는 경우: 반지름의 차 < 중심 좌표 간의 거리 < 반지름의 합
한 점에서 만나는 경우: 반지름의 차 = 중심 좌표 간의 거리 or 반지름의 합 = 중심 좌표 간의 거리
접점이 없는 경우: 반지름의 차 > 중심 좌표 간의 거리 & 반지름의 합 < 중심 좌표 간의 거리
코딩
#include <iostream>
using namespace std;
int main() {
int T;
int x1, y1, r1, x2, y2, r2;
cin >> T;
while (T--) {
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int d = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
int rm = (r1 - r2) * (r1 - r2);
int rp = (r1 + r2) * (r1 + r2);
if (d == 0) {
if (rm == 0) {
cout << -1 << "\n";
}
else cout << 0 << "\n";
}
else if (rm == d || rp == d) {
cout << 1 << "\n";
}
else if (rm < d && rp > d) {
cout << 2 << "\n";
}
else cout << 0 << "\n";
}
}
'Koala - 15기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[BOJ/Python3] 2630번 색종이 만들기 (0) | 2024.07.28 |
---|---|
[백준/Python] 4949번 : 균형잡힌 세상 (0) | 2024.07.28 |
[백준/C++] 17608번: 막대기 (0) | 2024.07.27 |
[백준/Python] 13410번: 거꾸로 구구단 (0) | 2024.07.27 |
[백준/Python] 1874번: 스택 수열 (0) | 2024.07.26 |