https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
원의 관계에 따라 생성되는 교점에 수를 묻는 문제였다. 나는 총 7가지로 가정하고 문제를 풀었다.
1. 두 원이 만나지 않은 경우 : (r1 + r2) ^ 2 < (x1 - x2) ^ 2 + (y1 - y2) ^ 2
2. 두 원이 외접하는 경우 : (r1 + r2) ^ 2 = (x1 - x2) ^ 2 + (y1 - y2) ^ 2
3. 두 원이 내접하는 경우 : (r1 - r2) ^ 2 = (x1 - x2) ^ 2 + (y1 - y2) ^ 2
4. 두 원이 동심원인 경우 : x1 == x2 ,y1 == y2, r1 != r2
5. 두 원이 동일한 경우 : x1 == x2 ,y1 == y2, r1 == r2
6. 두 원이 동심원을 제외한 포함 관계에 있는 경우 : (r1 - r2) ^ 2 > (x2 - x1) ^ 2 + (y2 - y1) ^ 2
7. 두 원이 두 점에서 만나는 경우 : (r1 + r2) ^ 2 > (x1 - x2) ^ 2 + (y1 - y2) ^ 2
한 가지 주의할 것은 동일원과 동심원일 때 비교하는 조건을 내접하는 조건과 외접하는 조건보다 위에 적어야 한다는 것이다. 이 점만 지켜준다면 해결할 수 있다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int x1, x2, y1, y2, r1, r2;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
if (pow((r1 + r2), 2) < pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //만나는 점이 없는 경우
cout << 0 << '\n';
}
else if (x1 == x2 && y1 == y2 && r1 == r2) { //동일 원인 경우
cout << -1 << '\n';
}
else if (x1 == x2 && y1 == y2 && r1 != r2) { //동심 원인 경우
cout << 0 << '\n';
}
else if (pow((r1 + r2), 2) == pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //외접하는 경우
cout << 1 << '\n';
}
else if (pow((r1 - r2), 2) == pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //내접하는 경우
cout << 1 << '\n';
}
else if (pow((r1 - r2), 2) > pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //동심원을 제외한 원 안에 원이 있는 경우
cout << 0 << '\n';
}
else { //두 점에서 만나는 경우
cout << 2 << '\n';
}
}
}
'백준' 카테고리의 다른 글
백준2596 - 비밀편지 (0) | 2019.12.02 |
---|---|
백준17265 - 나의 인생에는 수학과 함께 (0) | 2019.12.01 |
백준1092 - 배 (0) | 2019.11.25 |
백준2622 - 삼각형만들기 (0) | 2019.11.23 |
백준10164 - 격자상의 경로 (0) | 2019.11.20 |