터렛
문제: 터렛 (백준 1002번)
풀이 방법
Geometry
문제는 좌표평면을 떠올리며 풀어야 한다. 특지 중학교 고등학교 과정의 방정식 및 판정식을 기억하고 있으면 풀이에 도움이 된다.
해당 문제의 경우 두 원의 중점과 반지름이 주어진 상황에서 두 원의 교점의 개수를 구하는 문제이다. 두 원 사이의 관계는 아래와 같다.
1. 서로 다른 두 점에서 만난다.
- |r1-r2| < d < |r1+r2|
2. 한 점에서 접한다.
- 외접: |r1+r2| = d
- 내접: |r1-r2| = d
3. 만나지 않는다.
- 외부: |r1+r2| < d
- 내부: |r1-r2| > d
4. 무수히 많은 점에서 만난다.
- r1 = r2
여기서의 팁은 좌표를 이용한 거리 계산 시 루트를 이용하지만 그러한 경우 로스가 발생할 수 있으므로 그냥 제곱 계산을 그대로 이용하는 것이 좋다.
코드
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int t;
int x_1, x_2;
int y_1, y_2;
int r_1, r_2;
int main() {
cin >> t;
for (int i=0; i<t; i++) {
cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;
int d = pow((x_1-x_2),2)+pow((y_1-y_2),2);
int cond1 = pow((r_1-r_2),2);
int cond2 = pow((r_1+r_2),2);
if (d==0) {
if (cond1 == 0) cout << -1 << "\n";
else cout << 0 << "\n";
}
else if (d == cond1 || d == cond2) cout << 1 << "\n";
else if (cond1 < d && d < cond2) cout << 2 << "\n";
else cout << 0 << "\n";
}
return 0;
}
정리
좌표평면을 계산하는 문제를 코딩하는 것이 오랜만이라 익숙하지 않았다. 이러한 문제는 우선 종이에 적거나 푼 다음 코딩하는 것도 방법인것 같다.
댓글남기기