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 |