※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts