류재명이 어디 있는지 찾고 싶다!
조규현과 백승환의 위치와, 두 명이 각각 류재명과 얼마나 떨어져 있는지 입력받는다
류재명이 있을 수 있는 위치의 수를 계산하는 문제다
모든 경우를 다 따져봐야 한다
현재 조규현/백승환의 위치에서 r1/r2 만큼 떨어진 모든 점에 류재명이 있을 수 있으므로 원으로 표현한다
두 원의 교점이 류재명이 위치가 된다!!
1) 조규현과 백승환이 똑같은 곳에 위치할 때
왼쪽 그림처럼 r1=r2 라면 류재명이 위치할 수 있는 곳은 무한대이다 = -1
오른쪽 그림처럼 위치는 똑같지만 거리가 다르다면 류재명이 위치할 수 없다 = 0
2) 외접할 때 (r1 + r2 = d)
조규현과 백승환의 거리를 d라고 하자
r1+r2 = d일 때, 류재명이 위치할 수 있는 곳은 빨간점 한 곳뿐이다 = 1
3) 내접할 때 (d + r1 = r2 || d + r2 = r1)
이렇게 내접할 경우에도 류재명의 위치를 정확히 알 수 있다 = 1
4) 서로 아주 멀리 있을 때 (r1 + r2 < d)
이럴 경우엔 교점이 없기 때문에 류재명이 위치할 수 없다 = 0
5) 서로 아주 가까이 있을 때 (d + r1 < r2 || d + r2 < r1)
정말 그리기 뒤지게 어렵다
역시 류재명의 위치는 알 수 없다 = 0
6) else
위 다섯 가지 경우 외엔 류재명의 위치를 두 곳으로 추릴 수 있다 = 2
원의 교점은 0, 1, 2, 무한 넷 중 하나이므로 2를 넘는 수가 나올 수 없다!
이제 코딩은 쉽다.. 모든 경우를 생각하는 게 어려웠다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <iostream>
#include <cmath>
using namespace std;
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t, x1, y1, r1, x2, y2, r2;
double d;
cin >> t;
while (t--) {
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
if (x1 == x2 && y1 == y2) {
if (r1 == r2)
cout << -1 << "\n";
else
cout << 0 << "\n";
continue;
}
d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)); //두 점의 거리
if (r1 + r2 < d || d + r1 < r2 || d + r2 < r1)
cout << 0 << "\n";
else if (r1 + r2 == d || d + r1 == r2 || d + r2 == r1)
cout << 1 << "\n";
else
cout << 2 << "\n";
}
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 알고리즘/BOJ/C++] 11729 하노이 탑 이동 순서 (0) | 2021.01.18 |
---|---|
[백준 알고리즘/BOJ/C++] 2447 별 찍기 - 10 (0) | 2021.01.18 |
[백준 알고리즘/BOJ/C++] 3009 네 번째 점 (0) | 2021.01.17 |
[백준 알고리즘/BOJ/C++] 1085 직사각형에서 탈출 (0) | 2021.01.17 |
[백준 알고리즘/BOJ/C++] 골드바흐의 추측 (0) | 2021.01.17 |