백준 웹사이트 "1002번 - 터렛" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#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개입니다.
반응형
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 18108번 - 1998년생인 내가 태국에서는 2541년생?! (0) | 2022.01.31 |
---|---|
[백준/C언어] 10926번 - ??! (0) | 2022.01.30 |
[백준/C언어] 3053번 - 택시 기하학 (0) | 2022.01.28 |
[백준/C언어] 4153번 - 직각삼각형 (0) | 2022.01.27 |
[백준/C언어] 3009번 - 네 번째 점 (0) | 2022.01.27 |