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. 참고 |
질문이나 지적 있으시면 댓글로 남겨주세요~
도움 되셨으면 하트 꾹!
'<백준> > |c++| normal' 카테고리의 다른 글
[c++] 백준 2565 - 전깃줄(동적 계획법, dp) (0) | 2019.08.20 |
---|---|
|C++| 백준 1904 - 01타일(피보나치, 조합) (0) | 2019.07.28 |
[c++] 백준 2342 - Dance Dance Revolution(dp, 메모이제이션) (0) | 2019.07.13 |
[c++]백준 1562 - 계단 수 (0) | 2019.07.13 |
[c++]백준 1315 - RPG(메모이제이션, dp) (0) | 2019.07.12 |