알고리즘/문제 풀이

1002번: 터렛

Themion 2021. 12. 4. 02:28

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

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

두 원의 위치관계에 대해 묻는 문제이다.

류재명이 좌표 (x1, y1)에서 r1만큼, (x2, y2)에서 r2만큼 떨어져 있으므로 이를 그림으로 나타내면

검은 색은 조규현의 정보, 빨간색은 백승환의 정보

다음과 같이 나타낼 수 있다. (이 때 d는 두 원의 중심 간의 거리이다) 따라서 이 문제에서 각 테스트 케이스의 답은

d = 0이고 r1 = r2 : 두 원이 같으므로 -1

d > r1 + r2 혹은 d < |r1 - r2| : 원의 교점이 없으므로 0

d = r1 + r2 혹은 d = |r1 - r2| : 두 원이 외접 혹은 내접하므로 1

d < r1 + r2 이고 d > |r1 - r2| : 두 원이 두 점에서 만나므로 2

이 된다.

#include <cmath>
#include <cstdio>

int test_case() {
    // x1, y1: 조규현의 좌표
    // x2, y2: 백승환의 좌표
    // r1, r2: 조규환과 백승환이 계산한 거리
    // plus: 두 거리의 합, minus: 두 거리의 차
    // ret: 조규환과 백승환을 중심으로 거리가 r1, r2인 두 원의 위치 관계
    int x1, y1, r1, x2, y2, r2, plus, minus, ret = 0;
    // 조규환과 백승환의 거리
    double d;
    
    // 문제의 조건을 입력받은 뒤
    scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);
    // 둘이 측정한 거리의 합과 차를 계산
    plus = r1 + r2; minus = abs(r1 - r2);
    // 둘의 거리를 계산
    d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));

    // 둘의 거리와 둘이 계산한 거리에 따라 원의 위치 관계를 측정한다
    if (x1 == x2 && y1 == y2 && r1 == r2) ret = -1;
    else if (d > plus || d < minus) ret = 0;
    else if (d == plus || d == minus) ret = 1;
    else if (d < plus && d > minus) ret = 2;

    // 측정한 위치 관계를 반환
    return ret;
}

int main() {
    int T;
    // 테스트 케이스의 수를 입력받는다
    scanf("%d", &T);
    // T만큼 테스트 케이스를 반복
    while (T--) printf("%d\n", test_case());

    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

1005번: ACM Craft  (0) 2021.12.05
1004: 어린 왕자  (0) 2021.12.04
1003번: 피보나치 함수  (0) 2021.12.04
1001번: A-B  (0) 2021.12.03
1000번: A+B  (0) 2021.12.03