Notice
Recent Posts
Recent Comments
Link
궤도
[백준] 1002번 : 터렛 본문
문제
풀이
원의 내접과 외접에 대해 기억이 난다면 이 문제가 그리 어렵지 않을 것이고, 나처럼 기억이 가물가물 하다면 힘들 것이다. 각 좌표(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