[Baekjoon,1002] 터렛
각 터렛이 공격할 수 있는 위치를 표시한 원들의 접점의 개수를 찾으면 된다. 이때 원이 외접하는지와 내접하는지를 고려하여 개산해야 한다.
구현된 코드를 아래에서 볼 수 있다. max
와 min
함수를 이용하여 원이 다른 원 내부에 있는 경우를 쉽게 고려하는 것을 눈여겨 보자.
주의할 부분은 두 점과의 거리를 int
형으로 저장하는 경우 소수점 부분이 잘려나가 잘못된 결과를 초래할 수 있어 double
형으로 저장해야 한다.
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct Circle
{
int x, y, r;
// tmp 원과 중심점 거리를 구한다.
double dist(const Circle& tmp)
{
return sqrt(pow(y-tmp.y,2)+pow(x-tmp.x,2));
}
bool operator==(const Circle& rhs) const
{
return (x == rhs.x && y == rhs.y && r == rhs.r);
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
Circle c1,c2;
cin >> c1.x >> c1.y >> c1.r;
cin >> c2.x >> c2.y >> c2.r;
double d = c1.dist(c2);
int radSum = c1.r + c2.r;
// 두 원이 같을 때
if (c1 == c2)
cout << -1 << endl;
// 두 원이 접하지 않을 때
else if (d > radSum || (max(c1.r, c2.r) - d) > min(c1.r, c2.r))
cout << 0 << endl;
// 두 원이 접할 때
else if (d == radSum || (max(c1.r, c2.r) - d) == min(c1.r, c2.r))
cout << 1 << endl;
// 두 점에서 만날 때
else
cout << 2 << endl;
}
return 0;
}
댓글남기기