https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 $-1$ 출력한다.
www.acmicpc.net
두 점의 좌표가 주어지고, 각각의 점으로부터 r1, r2만큼의 거리에 있는 상대의 위치를 찾는 문제이다. 있을 수 있는 곳을 찾는 것이기 때문에 여러가지 경우가 생긴다. 따라서 원으로 그리면 편하다. 결국 두 원의 접점이 몇개인지를 찾는 문제이다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, x1, y1, r1, x2, y2, r2;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
double d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
if (x1 == x2 && y1 == y2) {
if (r1 == r2) {
cout << -1<<endl;
}
else {
cout << 0<<endl;
}
}
else {
if (d > r1 + r2 || d < sqrt(pow(r2 - r1, 2))) {
cout << 0<<endl;
}
else if (d + r1 == r2 || d + r2 == r1 || d == r1 + r2) {
cout << 1<<endl;
}
else {
cout << 2<<endl;
}
}
}
}
두 원의 중심점이 일치하는 경우에는 반지름(r)이 같은지에 따라서 점점이 무한대일수도, 0개일수도 있기에 먼저 예외처리를 해주었다.
두 원의 반지름의 합이 두 원의 중심점 거리보다 짧을 경우나 중심점 거리와 한 원의 반지름의 합이 다른 원의 반지름보다 짧은 경우 0개의 접점, 반지름의 합이 거리와 같을 경우와 원 안에서 접할 경우 1개의 접점, 그 외의 경우 2개의 접점을 출력하도록 구현해주었다.
'백준' 카테고리의 다른 글
백준 1052번 - 물병 (0) | 2024.01.19 |
---|---|
백준 1074번 - Z (0) | 2023.07.25 |
백준 1291번 - 이면수와 임현수 (0) | 2023.07.24 |
백준 1051번 - 숫자 정사각형 (0) | 2023.07.21 |
백준 2108번 - 통계학 (0) | 2023.07.21 |