728x90
https://www.acmicpc.net/problem/1002
처음 이 문제를 보았을 때, 좌표 개념이 들어가서 어렵다고 생각할 수 있지만,
정말 쉬운?? 수학 문제이다.
결국엔 조규현과 백승환의 범위 즉, 원에 겹치는 교점의 개수를 찾는 문제이다.
자 그렇다면 이제는 케이스를 나눠야 한다.
1. 두 원이 완전히 겹치는 경우(좌표와 반지름의 길이가 전부 같은 경우)
2. 두 원이 완전히 겹치지 않는 경우(좌표는 같으나 반지름의 길이가 같지 않은 경우)
3. 두 원의 교점이 2개인 경우
4. 두 원의 교점이 1개인 경우
5. 두 원의 교점이 0개인 경우
1번과 2번은 생각하기에 쉬우니
우선 3~5번 케이스를 생각하자.
원 과 원 사이의 교점을 구할 때 우리는 보통 피타고라스를 사용해서 원의 중점과 중점 사이의 거리(d)를 구한다.
두 원의 반지름의 길이를 외접(R1)이면 더하고, 내접(R2)이면 뺀다.
그리고
각 케이스마다 비교해서 리스트나 혹은 벡터에 넣으면 답이 쉽게 나온다.
그리고 1번과 2번의 케이스의 경우
1번은 두 원의 좌표가 같고 반지름이 같다면, 무한대의 교점이 발생하고
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
40
41
|
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main() {
int num;
cin >> num;
int x1, y1, r1, x2, y2, r2;
vector<int> result;
for (int i = 0; i < num; i++) {
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int d = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
int R1, R2;
R1 = (r1 + r2) * (r1 + r2);
R2 = (r1 - r2) * (r1 - r2);
if (d == 0 && r1 == r2) {
result.push_back(-1);
}
else if (d == R1 || d == R2) {
result.push_back(1);
}
else if (d > R1 || d < R2) {
result.push_back(0);
}
else if (d < R1 || d > R2) {
result.push_back(2);
}
}
for (int i = 0; i < num; i++) {
cout << result[i] << endl;
}
return 0;
}
|
cs |
728x90
'BaekJoon' 카테고리의 다른 글
[백준 알고리즘] 1026번 : 보물 (Python) 문제 풀이 (0) | 2022.08.04 |
---|---|
[백준 알고리즘] 1931번 : 회의실 배정 (Python) 문제 풀이 (0) | 2022.08.03 |
[백준 알고리즘] 2609번 : 최대공약수와 최소공배수 (C++) 문제 풀이 (0) | 2021.08.30 |
[백준 알고리즘] 1427번 : 소트인사이드 (JAVA) 문제 풀이 (0) | 2021.08.25 |
[백준 알고리즘] 1312번 : 소수 (Python) 문제 풀이 (0) | 2021.08.25 |