Algorithm/BOJ

[백준 알고리즘/BOJ/C++] 1002 터렛

pinevienna 2021. 1. 17. 19:35

 

 

류재명이 어디 있는지 찾고 싶다!

조규현과 백승환의 위치와, 두 명이 각각 류재명과 얼마나 떨어져 있는지 입력받는다

류재명이 있을 수 있는 위치의 수를 계산하는 문제다

 

모든 경우를 다 따져봐야 한다

현재 조규현/백승환의 위치에서 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