반응형

문제 링크: https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

<문제 풀이> 기하학

아군의 위치를 A(x1, y1), B(x2, y2), 상대편의 위치를 C(x, y)라고 하고 점과 점 사이의 거리를 계산하면
(x - x1)^2 + (y - y1)^2 = r1^2
(x - x2)^2 + (y - y1)^2 = r2^2

따라서 중심이 A, 반지름이 r1인 원과 중심이 B, 반지름이 r2인 원의 교점의 개수를 찾으면 됩니다.

 

1. 두 원이 일치할 때 (r1 = r2 and A = B)


2. 내접할 때 (선분 AB = r2 - r1)

 

두 원이 내접하면 접하는 점과 두 원의 중심이 일직선상에 위치해 있습니다.


3. 외접할 때 (선분 AB = r1 + r2)

 

두 원이 외접할 때 접하는 점과 두 원의 중심이 일직선상에 위치해 있습니다.



4. 두 원이 떨어져 있을 때 (선분 AB > r2 + r1)


5. 원 안에 원이 있을 때 (선분 AB  < r2 - r1)


6. 원이 두 점에서 만날 때 (선분 AB < r1 + r2)

 

<C++ 소스 코드>

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
#include <iostream>
using namespace std;
 
int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
 
    int test_case;
    cin >> test_case;
 
    while (test_case--) {
        int x1, y1, r1, x2, y2, r2;
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
        int d1 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
        int d2 = r1 * r1 + 2*r1 * r2 + r2 * r2;
        int d3 = r1 * r1 - 2 * r1 * r2 + r2 * r2;
 
        if (r1 == r2 && x1 == x2 && y1 == y2) cout << "-1\n"; // 두 원이 일치
        else if (d1 == d3) cout << "1\n"; // 내접
        else if (d1 == d2) cout << "1\n"; // 외접
        else if (d1 > d2) cout << "0\n"; // 두 원이 떨어져있음
        else if (d1 < d3) cout << "0\n"; // 원 안에 다른 원
        else cout << "2\n"; // 두 점에서 만날 때
    }
 
    return 0;
}
cs

 

반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 2075번] N번째 큰 수  (0) 2020.03.11
[백준 1715번] 카드 정렬하기  (0) 2020.03.11
[백준 11286번] 절댓값 힙  (0) 2020.03.10
[백준 1927번] 최소 힙  (0) 2020.03.09
[백준 11279번] 최대 힙  (0) 2020.03.09

+ Recent posts