본문 바로가기

코딩/백준 BOJ

[백준/C언어] 1002번 - 터렛

백준 웹사이트 "1002번 - 터렛" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

1002번: 터렛

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

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <math.h>

int main(void){
    int T;
    scanf("%d", &T);

    for(int i=0; i<T; i++){
        int x1, y1, r1, x2, y2, r2;
        scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);

        double distance = sqrt((double) (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
        int r_sum = r1+r2;
        int r_big, r_small;
        if(r1>r2){
            r_big = r1;
            r_small = r2;
        }
        else{
            r_big = r2;
            r_small = r1;
        }

        if(distance==0){
            if(r1==r2)
                printf("-1\n");
            else
                printf("0\n");
        }
        else{
            if(r_sum < distance)
                printf("0\n");
            else if(distance == r_sum)
                printf("1\n");
            else if(r_big-r_small < distance && distance < r_sum)
                printf("2\n");   
            else if(distance == r_big-r_small)
                printf("1\n");
            else 
                printf("0\n");
        }
    }
}

문제 풀이

  문제가 좀 복잡한데, 정리하면 결국 '두 원이 만드는 교점의 개수'를 구하는 문제입니다. 두 원이 만드는 교점의 개수는, 아래와 같이 정리할 수 있습니다.

 

(distance: 두 원의 중심 사이 거리, r_sum: 두 원의 반지름 합, r_big/r_small: 큰/작은 반지름의 길이)

1) distance > r_sum

   두 원은 만나지 않습니다. 따라서 교점의 개수는 0개입니다.

2) distance == r_sum

   두 원이 접하므로, 교점의 개수는 1개입니다.

3) r_big - r_small < distance < r_sum

   두 원이 포개져 있는 형태로, 교점의 개수는 2개입니다.

4) distance == r_big - r_small

   두 원이 안쪽으로 접하여 교점의 개수는 1개입니다.

5) 0 < distance < r_big-r_small

   한 원이 다른 원 안에 있으며, 만나지는 않습니다. 교점의 개수는 0개입니다.

6) distance == 0

   두 원의 중심이 같습니다. 이때 두 가지 경우가 존재하는데, 반지름의 길이가 같을 경우에는 교점의 개수가 무한대가 되고, 길이가 다를 경우에는 교점의 개수가 0개입니다.

반응형