728x90
https://www.acmicpc.net/problem/7869
문제 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
double xyr[][] = new double[2][3]; int i, j;
for (i = 0; i < 2; ++i)
for (j = 0; j < 3; ++j)
xyr[i][j] = Double.parseDouble(st.nextToken());
br.close();
if (xyr[0][2] < xyr[1][2]) { // r1이 r2보다 더 큰 수가 되도록 swap
double tmp[] = xyr[0]; xyr[0] = xyr[1]; xyr[1] = tmp;
}
double r1 = xyr[0][2], r2 = xyr[1][2];
double d = Math.sqrt(Math.pow(xyr[0][0] - xyr[1][0], 2) + Math.pow(xyr[0][1] - xyr[1][1], 2));
double res;
if (r1 + r2 <= d) // 서로 만나지 않거나 외접함
res = 0;
else if (r1 - r2 >= d) // 서로 만나지 않거나 내접함 ( 큰 원 안에 작은 원이 있음 )
res = r2 * r2 * Math.PI;
else { // 두 원이 서로 겹침
double theta1 = 2 * Math.acos((r1 * r1 + d * d - r2 * r2) / (2 * r1 * d));
double theta2 = 2 * Math.acos((r2 * r2 + d * d - r1 * r1) / (2 * r2 * d));
double s1 = (r1 * r1) * (theta1 - Math.sin(theta1)) / 2;
double s2 = (r2 * r2) * (theta2 - Math.sin(theta2)) / 2;
res = s1 + s2;
}
System.out.println(String.format("%.3f", res));
}
}
■ 두 점 사이의 거리 ( x1, y1 ) ~ ( x2, y2 )
■ 두 원의 위치 관계
- R1과 R2가 서로 외부에 있거나 외접하면 겹치는 부분이 없음
- R1 내부에 R2가 있는 경우 R2의 넓이만큼 겹침
- 나머지 경우에는 두 원이 두 점에서 만나며 겹치는 부분이 존재함
■ 원의 넓이
■ 두 원이 겹치는 부분의 넓이
A = S1 + S2
S1 = (각도가 θ1 인 부채꼴 넓이) - (각도가 θ1 인 이등변삼각형 넓이)
S2 = (각도가 θ2 인 부채꼴 넓이) - (각도가 θ2 인 이등변삼각형 넓이)
■ 부채꼴의 넓이
■ 이등변삼각형의 넓이
■ 코사인 법칙
< 두 원의 각각의 중심에서부터 두 원이 만나는 두 점을 이은 부채꼴의 각도 구하기 >
* θ1 구하기
theta1 = 2 * Math.acos( ( r1 * r1 + d * d - r2 * r2 ) / ( 2 * r1 * d ) )
* θ2 구하기
theta2 = 2 * Math.acos( ( r2 * r2 + d * d - r1 * r1 ) / ( 2 * r2 * d ) )
< 겹치는 부분의 넓이 (부채꼴의 넓이에서 이등변삼각형의 넓이를 뺀 값) 구하기 >
S1 = ( r1 * r1 ) * ( theta1 - Math.sin( theta1 ) ) / 2
S2 = ( r2 * r2 ) * ( theta2 - Math.sin( theta2 ) ) / 2
A = S1 + S2
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 2252 : 줄 세우기 / 위상 정렬 (0) | 2021.12.07 |
---|---|
[백준(Baekjoon)][자바(java)] 1069 : 집으로 / 기하 (0) | 2021.12.04 |
[백준(Baekjoon)][자바(java)] 2162 : 선분 그룹 / 기하 (0) | 2021.12.04 |
[백준(Baekjoon)][자바(java)] 20149 : 선분 교차 3 / 기하 (0) | 2021.11.27 |
[백준(Baekjoon)][자바(java)] 17387 : 선분 교차 2 / 기하 (0) | 2021.11.27 |