터렛
문제 링크: https://www.acmicpc.net/problem/1002
문제는 그리 어렵지 않으나 세세한 조율이 필요했던 문제이다.
두 좌표와 각 좌표에서 r이 주어졌을 때
류재명이라는 점이 존재할 경우의 수를 구하는 것이다.
시작하기 전 문제를 보면 두 좌표와 r이 주어짐을 볼 수 있다.
또한 r의 자리에 존재하는 경우의 수
그렇다 두 원의 교점에 대한 문제이다.
두 원의 교점에 대해 종류를 생각해보자.
이미지 출저: https://mathbang.net/101
이를 통하여 교점의 개수는 최대 2개 임을 알 수 있다.
다만, 조심해야할 점은 무한한 점이다.
같은 좌표 상 같은 반지름을 가지는 두 원은 무한한 교점을 가지게 되므로 조심해야 한다.
그렇다면 위 이미지를 토대로 식을 정리해보자.
- d < r + r'
- d > r' - r : 2
- d = r' - r : 1
- d < r' - r : 0
- d > r + r' : 0
- d = r + r' : 1
이러한 식이 성립된다.
그리고 같은 좌표일 경우
- d = 0, r = r' : 무한
- d = 0, r != r' : 0
이를 통한 코드를 보자.
#include<iostream>
#include<cmath>
using namespace std;
int length(int x1, int y1, int x2, int y2) {
return pow(x1-x2, 2) + pow(y1-y2, 2);
}
int main() {
int T;
cin >> T;
while (T--) {
int x1, y1, r1, x2, y2, r2;
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int l = length(x1, y1, x2, y2);
int r = pow(r1 + r2,2);
if (l == 0) {
if (r1 == r2)
cout << -1 << endl;
else
cout << 0 << endl;
}
else if (l > r)
cout << 0 << endl;
else if (l == r)
cout << 1 << endl;
else if (l < r) {
int R = pow(r1 - r2, 2);
if (l == R)
cout << 1 << endl;
else if (l < R)
cout << 0 << endl;
else if (l > R)
cout << 2 << endl;
}
}
return 0;
}
원래 sqrt를 통한 정확한 길이 l을 구하고자 했으나, double형으로 반환 되는 소수점 비교로 인하여 정확한 비교가 안되었다.
sqprt를 지우고 비교해주는 값들을 제곱하여 비교함으로써 정확한 비교를 할 수 있다.
'ProblemSolving' 카테고리의 다른 글
[BOJ] 1026_보물 (0) | 2021.01.20 |
---|---|
[BOJ] 1021_회전하는 큐 (0) | 2021.01.19 |
[BOJ] 1015_수열정렬 (0) | 2021.01.18 |
[BOJ] 1037_약수 (0) | 2021.01.16 |
[BOJ] 1010_다리 놓기 (2) | 2021.01.15 |
최근댓글