티스토리 뷰

반응형

내가 이 문제를 틀린 이유는 소수점 3개(0.000) 을 지키지 않아서 였다.

이런 실수에 주의하자.

문제

두 원이 주어졌을 때, 교차하는 영역의 넓이를 소수점 셋째자리까지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.

출력

첫째 줄에 교차하는 영역의 넓이를 반올림해 소수점 셋째자리까지 출력한다.

구현

import math

x0, y0, r0, x1, y1, r1 = map(float, input().split())


def area(x0, y0, r0, x1, y1, r1):
    d = math.sqrt((x0 - x1) ** 2 + (y0 - y1) ** 2)
    rr0 = r0 * r0
    rr1 = r1 * r1
    # Circles do not overlap
    if (d > r1 + r0):
        return 0
    # Circle1 is completely inside circle0
    elif (d <= abs(r0 - r1) and r0 >= r1):
        return math.pi * rr1
    # Circle0 is completely inside circle1
    elif (d <= abs(r0 - r1) and r0 < r1):
        # Return area of circle0
        return math.pi * rr0
    # Circles partially overlap
    else:
        phi = (math.acos((rr0 + (d * d) - rr1) / (2 * r0 * d))) * 2
        theta = (math.acos((rr1 + (d * d) - rr0) / (2 * r1 * d))) * 2
        area1 = 0.5 * theta * rr1 - 0.5 * rr1 * math.sin(theta)
        area2 = 0.5 * phi * rr0 - 0.5 * rr0 * math.sin(phi)

        # Return area of intersection
        return area1 + area2


answer = float(round(1000 * area(x0, y0, r0, x1, y1, r1)) / 1000)
print('%.3f' % answer)
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함