백준 사이트를 처음 접하고 3번째로 푼 실버 문제이다.
문제를 읽어보면 두 점의 좌표와 함께 그 두 점과 류제명까지의 거리가 나와있는 것을 보고 원을 떠올릴 수 있다.
즉, 두 기준점을 원의 중심, 측정된 거리를 반지름으로 하는 원으로 그릴 수가 있다.
원을 그렸으면 문제 해결의 방향은 잡은 것이다. 류제명이 있을 수 있는 위치는 두 원의 교점이 될 것이다. 만약 두 원이 서로다른 두 점에서 만나면 위치는 2개, 한 점에서 접하면 1개, 교점이 없으면 0이다.
문제에서 그러한 점이 무한개이면 -1을 출력하라 했는데 그러한 점이 무한개라면 두 원이 동일해야만 한다.
첫 번째 반지름을 , 두 번째 반지름을 라고 하고 두 원의 중심 사이의 거리를 라고 하면
두 원이 두 점에서 만나기 위해서는 이어야 하고
두 원이 한 점에서 만나기 위해서는 이어야 하고
두 원이 만나지 않기 위해서는 이어야 한다.
위 관계식을 갖고 코드를 짜면 코드는 다음과 같다.
#include<stdio.h>
int main(void)
{
int T, X_1, Y_1, r_1, X_2, Y_2, r_2;
int length_2;
int sub;
scanf_s("%d", &T);
while (T--)
{
scanf_s("%d%d%d%d%d%d", &X_1, &Y_1, &r_1, &X_2, &Y_2, &r_2);
length_2 = (X_1 - X_2) * (X_1 - X_2) + (Y_1 - Y_2) * (Y_1 - Y_2);
sub = r_1 > r_2 ? r_1 - r_2 : r_2 - r_1;
if (r_1 == r_2 && length_2 == 0) { printf("-1\n"); }
else if (length_2 > (r_1 + r_2) * (r_1 + r_2) || length_2 < sub * sub) { printf("0\n"); }
else if (length_2 < (r_1 + r_2) * (r_1 + r_2) && length_2 > sub * sub) { printf("2\n"); }
else if (length_2 == (r_1 + r_2) * (r_1 + r_2) || length_2 == sub * sub) { printf("1\n"); }
}
return 0;
}