1 분 소요

문제: 터렛 (백준 1002번)

image

풀이 방법

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;
}  

정리

좌표평면을 계산하는 문제를 코딩하는 것이 오랜만이라 익숙하지 않았다. 이러한 문제는 우선 종이에 적거나 푼 다음 코딩하는 것도 방법인것 같다.

댓글남기기