[백준] 1002번 터렛 / C++
#문제
#풀이
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
while (n--)
{
int x, y, r, x2, y2, r2;
cin >> x >> y >> r >> x2 >> y2 >> r2;
double dist = sqrt(pow(x2 - x, 2) + pow(y2 - y, 2));
if (dist == 0)
{
if (r == r2)
{
cout << -1 << '\n';
}
else
{
cout << 0 << '\n';
}
}
else
{
if (dist > r + r2)
{
cout << 0 << '\n';
}
else if (dist < abs(r - r2))
{
cout << 0 << '\n';
}
else if (dist == r + r2)
{
cout << 1 << '\n';
}
else if (dist == abs(r - r2))
{
cout << 1 << '\n';
}
else
{
cout << 2 << '\n';
}
}
}
return 0;
}
#정리
두 개 터렛의 좌표와 목표와의 거리가 주어지고, 목표가 존재할 수 있는 좌표의 수를 구하는 문제다. 그림으로 각 터렛의 좌표를 표시하고, 목표와의 거리를 이용해 원을 그려보면 두 개의 원이 내접하거나 떨어져 있는 경우를 확인할 수 있었다. 주의해야 할 점은 터렛 두 개가 겹칠 수도 있기 때문에, 각 거리가 0인 경우와 0이 아닌 경우를 나눠 생각해야 했다. 먼저 두 개 터렛의 거리를 구한다. 2차원 좌표 두 점 거리를 구하는 방법은 유클리드 공식을 사용하여 구했다. double dist = sqrt(pow(x2 - x, 2) + pow(y2 - y, 2)) (sqrt는 루트, pow는 제곱을 구하는 함수다.) 중심이 같은 경우, 반지름이 같다면 ‘-1’, 반지름이 다르다면 두 개 원이 겹치지 않기 때문에 ‘0’을 출력. 중심이 다를 때는 떨어져 있을 때, 한 원이 다른 원의 내부에 있을 때, 내접할 때, 만날 때 등을 고려하여 if문을 작성하여 해결했다. 그리고 좌표가 음수일 수 있기 때문에 절대값을 반환하는 abs 함수를 사용하여 조건을 꾸렸다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: