※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 7869번 문제인 두 원이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/7869
7869번: 두 원
첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.
www.acmicpc.net
먼저, 한 원이 다른 원 내부에 완전히 포함된다면 포함되는 원의 넓이를, 두 원이 전혀 겹치지 않는다면 "0.000"을 답으로 출력해 문제를 해결할 수 있다.
그 외의 경우는 두 원이 겹치는 영역을 두 원의 교점 A와 B가 잇는 선분으로 나누어, 각 영역의 넓이를 (부채꼴의 넓이 - 삼각형의 넓이)의 형태로 구해 문제를 해결할 수 있다. 아래의 그림을 참고하자.

이 때, 각 부채꼴의 중심각은 세 변의 길이가 r1, r2 및 두 원의 중심 사이 거리 d를 이용해 코사인법칙으로 계산해낼 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;
ld PI = acos((ld)-1);
ld X1, Y1, r1, X2, Y2, r2, d;
void solve() {
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed;
cout.precision(3);
cin >> X1 >> Y1 >> r1 >> X2 >> Y2 >> r2;
d = hypot(X1 - X2, Y1 - Y2);
if (r1 + r2 <= d) cout << 0.000;
else if (r1 + d <= r2) cout << PI * r1 * r1;
else if (r2 + d <= r1) cout << PI * r2 * r2;
else {
ld theta1 = acos((r1 * r1 - r2 * r2 + d * d) / (2 * r1 * d)) * 2;
ld theta2 = acos((r2 * r2 - r1 * r1 + d * d) / (2 * r2 * d)) * 2;
cout << (theta1 * r1 * r1 / 2) - (r1 * r1 * sin(theta1) / 2) + (theta2 * r2 * r2 / 2) - (r2 * r2 * sin(theta2) / 2);
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3007 // C++] 숫자 원 (0) | 2023.04.28 |
---|---|
[BOJ 7868 // C++] 해밍 수열 (0) | 2023.04.27 |
[BOJ 2693 // C++] N번째 큰 수 (0) | 2023.04.25 |
[BOJ 2701 // C++] 육각 퍼즐 (0) | 2023.04.24 |
[BOJ 2700 // C++] 볼록 격자 다각형의 내부점 (1) | 2023.04.23 |