dh-winternagi 님의 블로그
(7869) 두 원 본문
https://www.acmicpc.net/problem/7869
단계별로 풀어보기
39단계(기하 2) 9번째
두 원 사이의 거리와 각각의 반지름을 비교하여 겹치는 모양을 파악한 뒤 각각의 모양에 맞는 공식으로 넓이를 구하면 된다.
안 겹치면 0, 완전히 겹치면 작은 원의 넓이와 똑같지만 일부분만 겹칠 때가 문제다. 겹치는 부분의 중심각을 구하고 호와 현을 구하는 공식을 쓰면 되는데, 알고리즘이 아닌 수학 공식이므로 설명은 생략한다.

#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout<<fixed;
cout.precision(3);
double x1, y1, r1, x2, y2, r2, ans;
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
double d= sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
if(d>=r1+r2){
ans= 0;
}else if(r1-r2>=d){
ans= M_PI*r2*r2;
}else if(r2-r1>=d){
ans= M_PI*r1*r1;
}else{
double a1= acos((r1*r1+d*d-r2*r2)/(2*r1*d));
double a2= acos((r2*r2+d*d-r1*r1)/(2*r2*d));
ans= (r1*r1*a1)+(r2*r2*a2)-(r1*r1*sin(2*a1)/2)-(r2*r2*sin(2*a2)/2);
}
cout << ans;
return 0;
}'백준 (C++) > Solve' 카테고리의 다른 글
| (11723) 집합 (0) | 2026.04.22 |
|---|---|
| (1069) 집으로 (0) | 2026.04.22 |
| (1688) 지민이의 테러 (0) | 2026.04.22 |
| (2162) 선분 그룹 (0) | 2026.04.22 |
| (20149) 선분 교차 3 (0) | 2026.04.22 |
