Baekjoon Online Judge

백준 1002번) 터렛

judy1467 2023. 1. 9. 03:41

본문의 코드보다 더 효율적인 코드가 분명 존재합니다.

참고만 해주시면 감사하겠습니다.

코드 지적은 언제나 환영입니다.


풀이

문제를 두 원의 접점 갯수로 생각하면 쉽게 풀 수 있다.

각각의 사람에대한 적의 거리가 주어졌기 때문에

두 원이 있다고 생각 했을 때 접점의 갯수가 적의 위치가 될 수 있는 좌표의 수 이다.

 

따라서, 두 사람의 거리를 구하고 거리를 이용하여 두 사람의 관계를 따져보면 교점의 갯수를 구할 수 있다.

 

코드

#include "iostream"
#include "cmath"

using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int tc;
    cin >> tc;

    for(int i = 0 ; i < tc ; i++){
        int x1, y1, r1, x2, y2, r2;
        cin >> x1 >> y1 >> r1;
        cin >> x2 >> y2 >> r2;

        double distance = sqrt(pow(x1-x2, 2)+pow(y1-y2, 2));
        if(distance == 0 && r1 == r2){ // 두 사람이 같은 위치에 있고 적과의 거리가 같음 == 적의 위치가 어디든지 가능
            cout << "-1\n";
            continue;
        }
        else if(abs(r1-r2) == distance || r1 + r2 == distance){ // 두 사람이 서로 내접 또는 외접 == 교점이 한 개
            cout << "1\n";
            continue;
        }
        else if(abs(r1-r2) < distance && distance < r1+r2){ // 두 사람의 교점이 없음
            cout << "2\n";
            continue;
        }
        else{
            cout << "0\n";
            continue;
        }

    }

    return 0;
}