
내가 생각했을때 문제에서 원하는부분
첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다.
실수는 최대 소수점 둘째자리까지 주어진다.
첫째 줄에 교차하는 영역의 넓이를 반올림해 소수점 셋째자리까지 출력한다.
내가 이 문제를 보고 생각해본 부분
먼저 입력받은 두 원의 중심 좌표와 반지름을 double 타입으로 받고,
두 원 사이의 거리 d를 유클리드 거리 공식을 이용해 계산한다
조건문으로 원의 위치 관계를 체크하는데,
d≥r_1+r_2 이면 두 원이 떨어져 교차 영역이 없으므로 면적을 0으로 설정한다.
d≤∣r_1−r_2∣ 이면 한 원이 다른 원 안에 완전히 포함된 상태로 가장 작은 원의 넓이가 교차 영역이 된다.
두 원이 부분적으로 겹치는 경우, 주어진 교차 영역 공식에 따라 각도 α, β를 아크코사인 함수로 구한 뒤 넓이를 계산한다.
제곱근 부분은 두 원의 교차부 위치를 결정하는 4개의 길이 사이의 곱근으로, 교차 영역의 접선 길이에 따른 영역을 빼준다.
마지막으로 System.out.printf를 사용해 소수점 셋째 자리까지 반올림된 넓이를 출력한다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 7869번 문제
public class Main1346 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
double x1 = Double.parseDouble(st.nextToken());
double y1 = Double.parseDouble(st.nextToken());
double r1 = Double.parseDouble(st.nextToken());
double x2 = Double.parseDouble(st.nextToken());
double y2 = Double.parseDouble(st.nextToken());
double r2 = Double.parseDouble(st.nextToken());
double d = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
double area;
if (d >= r1 + r2) {
// 두 원이 떨어져 있을 때 교차 영역 없음
area = 0;
} else if (d <= Math.abs(r1 - r2)) {
// 한 원이 다른 원 안에 완전히 포함된 경우
double minRadius = Math.min(r1, r2);
area = Math.PI * minRadius * minRadius;
} else {
// 두 원이 부분적으로 겹칠 때
double alpha = Math.acos((d * d + r1 * r1 - r2 * r2) / (2 * d * r1));
double beta = Math.acos((d * d + r2 * r2 - r1 * r1) / (2 * d * r2));
area = r1 * r1 * alpha + r2 * r2 * beta - 0.5 * Math.sqrt(
(-d + r1 + r2) * (d + r1 - r2) * (d - r1 + r2) * (d + r1 + r2)
);
}
System.out.printf("%.3f\n", area);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.