[c++/백준] 1002번: 터렛

조히·2023년 4월 20일
0

PS

목록 보기
60/82

문제 링크

1002번: 터렛

풀이

원의 교접을 떠올리면 쉽게 풀 수 있는 문제

  1. 난 거리를 제곱근 해서 구해주려고 swap 함수를 따로 짰다.
  2. 두 중심 좌표의 거리는 d, 두 원의 반지름을 더해준 값은 plus, 빼준 값은 minus이다.
  3. 원의 위치 관계를 분기로 구해준다.
    3-1. 두 원이 일치하면(d==0 && r1==r2) 무한대로 존재할 수 있으므로 -1
    3-2. 한 점에서 만나려면 외접하는 경우(d==plus), 내접하는 경우(d==minus)가 있다.
    3-3. 두 점에서 만나려면 dminus보다 크고, plus보다 작아야 한다.
    3-4. 안 만나려면 동심원(d==0)이거나, dplus보다 크고, minus보다 작아야 한다.

코드

#include <iostream>
#include <cmath>
using namespace std;

void swap(int &x1, int &y1, int &r1, int &x2, int &y2, int &r2)
{
	if (r1 < r2) // r1이 반지름이 큰 원이 오게
	{
		int tmp = x1;
		x1 = x2;
		x2 = tmp;

		tmp = y1;
		y1 = y2;
		y2 = tmp;

		tmp = r1;
		r1 = r2;
		r2 = tmp;
	}
}

int main(void)
{
	int t;
	cin >> t;
	for (int i = 0; i < t; i++)
	{
		int x1, y1, r1;
		int x2, y2, r2;
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		swap(x1, y1, r1, x2, y2, r2);

		double d = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
		int minus = r1 - r2;
		int plus = r1 + r2;

		if (d == 0 && r1 == r2) cout << -1 << endl;
		else if (d == minus || d == plus) cout << 1 << endl;
		else if (minus < d && d < plus) cout << 2 << endl;
		else if (d == 0 || d > plus || d < minus) cout << 0 << endl;
	}

	return 0;
}
profile
Juhee Kim | Game Client Developer

0개의 댓글