궤도

[백준] 1002번 : 터렛 본문

💻 현생/⛓ 알고리즘

[백준] 1002번 : 터렛

영이오 2020. 10. 14. 22:59

문제

 


풀이

 

원의 내접과 외접에 대해 기억이 난다면 이 문제가 그리 어렵지 않을 것이고, 나처럼 기억이 가물가물 하다면 힘들 것이다. 각 좌표(x1, y1 / x2, y2)를 중심으로 하고 반지름이 (r1 / r2)인 원을 그려보자. 류재명이 존재할 수 있는 위치는 각각의 경우에 대해 해당 원의 경계선이다. 원을 2개 그리게 되니까 두 원의 교점의 수가 류재명이 있을 수 있는 좌표의 수다. 그렇다면 두 원의 관계는 어떤 경우가 있을까.

빨간원과 초록원은 조규현과 백승환의 위치가 같은 경우이다. 이 상황에서 두 원의 반지름이 다르면 류재명이 존재할 수 있는 위치는 없고, 같다면 무한하다. 검은원과 보라색원은 두 원의 교점이 1개인 경우다. 각각 내접, 외접하고 있다. 파란원은 교점의 수가 2개이고 주황색 원은 교점이 없다. 이 경우를 모두 코드에 반영하면 된다.


소스코드

 

#include <iostream>
#include <cmath> //sqrt 쓰면 값이 손실됨
using namespace std;

int main() { //수학적 사고 요구
	int T;
	double x_1, x_2, y_1, y_2, r_1, r_2;

	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;
		double dist = pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2);
		double r_sub = pow(r_1 - r_2, 2);
		double r_add = pow(r_1 + r_2, 2);
		if (dist == 0) { //둘이 같은 좌표에 있을 때
			if (r_1 == r_2)
				cout << -1 << endl;
			else
				cout << 0 << endl;
		}
		else { //둘이 다른 좌표에 있을 때
			if (r_sub < dist && dist < r_add) //교점이 2개
				cout << 2 << endl;
			else if (r_add == dist || r_sub == dist) //외접, 내접
				cout << 1 << endl;
			else //만나지 않음
				cout << 0 << endl;
		}
	}
}
Comments