백준 두 원

KIMYEONGJUN·6일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 두 원의 중심과 반지름 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();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글