Koala - 15기/기초 알고리즘 스터디

[백준/C++] 1002번: 터렛

.우디. 2024. 7. 27. 16:15

문제 & 링크

https://www.acmicpc.net/problem/1002

 

풀이

1. x1, y1을 중심으로 하고 반지름이 r1인 원과 x2, y2를 중심으로 하고 반지름이 r2인 원의 접점을 구하는 문제이다.

2. 두 원의 중심 좌표가 같을 경우 반지름의 길이가 같다면 접점은 무한대가 되고, 다르다면 접점은 없게 된다.

3. 두 원의 중심 좌표가 다를 경우 접점이 두 개, 한 개, 없는 경우로 나뉜다.

3-1. 접점이 두 개인 경우는 중심 좌표 간의 거리가 각 원의 반지름의 합보다는 짧고, 반지름의 차보다는 긴 경우이다.

3-2. 접점이 한 개인 경우는 중심 좌표 간의 거리가 각 원의 반지름의 합과 같거나 반지름의 차와 같은 경우이다.

3-3. 접점이 없는 경우는 그 외의 경우이다.

 

참고 자료

빨간색 선: r1, 파란색 선: r2, 초록색 선: 중심 좌표 간의 거리

 

두 case 모두 한 점에서 만나는 경우이다.

case 1에서 중심 좌표 간의 거리가 가까워지면 두 점에서 만나게 되고, 멀어지면 접점이 없어진다.

case 2에서 중심 좌표 간의 거리가 가까워지면 접점이 없어지고, 멀어지면 두 점에서 만나게 된다.

 

정리

두 점에서 만나는 경우: 반지름의 차 < 중심 좌표 간의 거리 < 반지름의 합

한 점에서 만나는 경우: 반지름의 차 = 중심 좌표 간의 거리 or 반지름의 합 = 중심 좌표 간의 거리

접점이 없는 경우: 반지름의 차 > 중심 좌표 간의 거리 & 반지름의 합 < 중심 좌표 간의 거리

 

코딩

#include <iostream>

using namespace std;

int main() {
    int T;
    int x1, y1, r1, x2, y2, r2;
    
    cin >> T;
    
    while (T--) {
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;

        int d = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
        int rm = (r1 - r2) * (r1 - r2);
        int rp = (r1 + r2) * (r1 + r2);
        
        if (d == 0) {
            if (rm == 0) {
                cout << -1 << "\n";
            }
            else cout << 0 << "\n";
        }
        else if (rm == d || rp == d) {
            cout << 1 << "\n";
        }
        else if (rm < d && rp > d) {
            cout << 2 << "\n";
        }
        else cout << 0 << "\n";
    }
    
}