728x90

 0. [c++] 백준 


https://www.acmicpc.net/problem/1002


 1. 풀이

이 문제에 수학적 개념이 활용되므로, 이를 간단히 정리해보자.

두 원의 교점의 개수는 일정한 규칙에 의해 생기게 된다.

위의 사진과 순서는 조금 다른데, 이를 정리해보겠다.


1) 원이 외부에서 서로 만나지 않는 경우(그림 상 4번)

R1 + R2 < D


2) 원이 외부에서 외접하는 경우(그림 상 2번)

R1 + R2 = D


3) 원이 2개의 교점을 가지는 경우(그림 상 1번)

|R1 - R2| < D < R1 + R2


4) 원이 내부에서 내접하는 경우(그림 상 3번)

|R1 - R2| = D


5) 원이 내부에서 만나지 않는 경우

|R1 - R2| > D


이렇게 기본적인 5개의 식이 존재하고, 추가적으로 이번 문제에서는 원이 서로 겹쳐지는 경우는 -1을 출력해야 하므로, 이 경우를 가장 처음에 해결하도록 하였다.


추가적으로 float를 이용하면 혹시 모를 오류가 발생할 경우를 고려하여 long을 활용해 문제를 해결하였다.

 2. 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
 
using namespace std;
 
typedef unsigned long long ull;
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    long x1, y1, r1, x2, y2, r2;
    int N;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
 
        long D = (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2);
 
        long minR = (r1 - r2)*(r1 - r2);
        long sumR = (r1 + r2)*(r1 + r2);
 
        if (x1 == x2 && y1 == y2 && r1 == r2)
            cout << -1 << endl;
        else if (D > sumR)
            cout << 0 << endl;
        else if (D == sumR)
            cout << 1 << endl;
        else if (minR < D && sumR > D)
            cout << 2 << endl;
        else if (minR == D)
            cout << 1 << endl;
        else
            cout << 0 << endl;
        
    }
    
 
    return 0;
}
cs


 3. 참고




질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts