[Baekjoon,1002] 터렛

1 분 소요

각 터렛이 공격할 수 있는 위치를 표시한 원들의 접점의 개수를 찾으면 된다. 이때 원이 외접하는지와 내접하는지를 고려하여 개산해야 한다.

구현된 코드를 아래에서 볼 수 있다. maxmin함수를 이용하여 원이 다른 원 내부에 있는 경우를 쉽게 고려하는 것을 눈여겨 보자. 주의할 부분은 두 점과의 거리를 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;
}

댓글남기기