3 minute read

두 원

문제 좜처

ICPC > Regionals > NEERC Far-Eastern Subregional 2000 F번

풀이

제 풀이 읽기 μ „, 이 글을 μ½μ–΄λ³΄μ‹œλŠ”κ±Έ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.
제 κΈ€κ³Ό 같은 풀이λ₯Ό μ„€λͺ…ν•˜κ³  있고, κ°€λŠ₯ν•œ 이해가 μ‰¬μš΄ 풀이λ₯Ό λ³΄λŠ”κ²Œ 도움이 될 것 κ°™μ•„ μ˜¬λ¦½λ‹ˆλ‹€.

고등학ꡐ μˆ˜ν•™μ„ 잘 λ°°μ› λ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
λ¬Έμ œμ—μ„œ 두 μ›μ˜ 쀑심과 λ°˜μ§€λ¦„λ§Œ μ£ΌκΈ° λ•Œλ¬Έμ—, μš°μ„  두 원이 κ΅μ°¨ν•˜λŠ”μ§€λΆ€ν„° ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€. 두 μ›μ˜ 쀑심 μ‚¬μ΄μ˜ 거리λ₯Ό μ΄μš©ν•΄ κ΅μ°¨ν•˜μ§€ μ•Šκ±°λ‚˜ μ™„μ „νžˆ ν¬ν•¨λ˜λŠ” 경우λ₯Ό μ œμ™Έν•˜λ©΄, λ‚˜λ¨Έμ§€ λͺ¨λ“  κ²½μš°μ—μ„œ 두 원이 κ΅μ°¨ν•œλ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μš°μ„  κ΅μ°¨ν•˜μ§€ μ•Šκ±°λ‚˜ ν¬ν•¨λ˜λŠ” 경우λ₯Ό κ΅¬ν•΄λ΄…μ‹œλ‹€. λ§Œμ•½ 두 μ›μ˜ 쀑심 μ‚¬μ΄μ˜ 거리가 각 μ›μ˜ λ°˜μ§€λ¦„μ˜ 합보닀 크닀면, 두 원은 κ΅μ°¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

not intersect two circles

\[\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} > r_1 + r_2\]

λ˜ν•œ 두 μ›μ˜ 쀑심 μ‚¬μ΄μ˜ 거라가 두 μ›μ˜ λ°˜μ§€λ¦„μ˜ 차이 보닀 μž‘λ‹€λ©΄, ν•˜λ‚˜μ˜ 원이 λ‹€λ₯Έ 원 μ•ˆμ— μ™„μ „νžˆ ν¬ν•¨λ˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

includes two circles

\[\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \leq \left|r_1 - r_2\right|\]

μœ„ 두 경우λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ κ²½μš°λŠ” 두 원이 κ΅μ°¨ν•œλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
κ΅μ°¨ν•˜λŠ” 넓이λ₯Ό κ΅¬ν•˜λŠ” 것은 (제 기얡상) κ³ 2 μ―€ λ°°μ› λ˜ 것 같은 μ‚Όκ°ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

includes two circles

두 μ›μ˜ 쀑심을 각각 O₁, O₂라고 ν•˜κ³ , λ°˜μ§€λ¦„μ„ r₁, r₂라고 μ„€μ •ν•΄λ΄…μ‹œλ‹€. 두 원이 κ΅μ°¨ν•˜λŠ” 점듀을 P와 P'라고 ν•˜λ©΄, 이 λ„€ 점으둜 μ‚Όκ°ν˜• O₁Oβ‚‚P와 μ‚Όκ°ν˜• O₁Oβ‚‚P'λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ μ„ λΆ„ O₁Oβ‚‚μ˜ κΈΈμ΄λŠ” 두 μ›μ˜ 쀑심 μ‚¬μ΄μ˜ 거리 dκ°€ λ©λ‹ˆλ‹€.

ν₯λ―Έλ‘­κ²Œλ„, 이 두 μ‚Όκ°ν˜•μ€ μ„Έ λ³€μ˜ 길이가 λͺ¨λ‘ 같은 SSS 합동 μ‚Όκ°ν˜•μž…λ‹ˆλ‹€.
λ”°λΌμ„œ 각 PO₁Oβ‚‚μ˜ ν¬κΈ°λŠ” 전체 쀑심각 ΞΈβ‚μ˜ μ ˆλ°˜μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€. 이제 μ‚Όκ°ν˜• O₁Oβ‚‚P의 λͺ¨λ“  λ³€μ˜ 길이λ₯Ό μ•Œκ³  μžˆμœΌλ―€λ‘œ, 코사인 제2법칙을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

코사인 제2법칙

\[\begin{flalign*} & a^2 = b^2 + c^2 - 2bc \cdot cosA & \end{flalign*}\]

코사인 제2법칙에 λ”°λ₯΄λ©΄ ${r_{2}}^2 = {r_{1}}^2 + d^2 - 2r_{1}d\cdot\cos\dfrac{ΞΈ_{1}}{2}$ λΌλŠ” 관계식을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 이 식을 $ΞΈ_{1}$에 λŒ€ν•΄ μ •λ¦¬ν•˜λ©΄, μ½”μ‚¬μΈμ˜ μ—­ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ $ΞΈ_{1} = 2\cos^{-1}\left(\dfrac{d^2 + {r_{1}}^2 - {r_{2}}^2}{2d\cdot r_{1}}\right)$λΌλŠ” 곡식을 λ„μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§ˆμ°¬κ°€μ§€ λ°©λ²•μœΌλ‘œ $ΞΈ_{2}$에 λŒ€ν•΄μ„œλ„ $ΞΈ_{2} = 2\cos^{-1}\left(\dfrac{d^2 + {r_{2}}^2 - {r_{1}}^2}{2d\cdot r_{2}}\right)$λΌλŠ” 곡식을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

\[{r_{2}}^2 = {r_{1}}^2 + d^2 - 2r_{1}d\cdot\cos\dfrac{ΞΈ_{1}}{2}\] \[ΞΈ_{1} = 2\cos^{-1}\left(\dfrac{d^2 + {r_{1}}^2 - {r_{2}}^2}{2d\cdot r_{1}}\right) \quad \quad ΞΈ_{2} = 2\cos^{-1}\left(\dfrac{d^2 + {r_{2}}^2 - {r_{1}}^2}{2d\cdot r_{2}}\right)\]

이제 두 λΆ€μ±„κΌ΄μ˜ 쀑심각을 λͺ¨λ‘ κ΅¬ν–ˆμœΌλ―€λ‘œ, λ°˜μ§€λ¦„κ³Ό 쀑심각을 μ΄μš©ν•˜μ—¬ ν•„μš”ν•œ 넓이듀을 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.
ꡐ차 μ˜μ—­μ˜ 넓이λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” 두 개의 뢀채꼴 λ„“μ΄μ˜ ν•©μ—μ„œ 두 개의 μ‚Όκ°ν˜• λ„“μ΄μ˜ 합을 λΉΌμ•Ό ν•©λ‹ˆλ‹€.

뢀채꼴 넓이 곡식

\[\begin{flalign*} & S = \dfrac{1}{2}r^2\theta & \end{flalign*}\]

뢀채꼴 λ„“μ΄μ˜ ν•© $S_{1}$은 $\dfrac{1}{2} {r_{1}}^2 \theta_1 + \dfrac{1}{2} {r_{2}}^2 \theta_2$κ°€ 되고, μ‚Όκ°ν˜• λ„“μ΄μ˜ ν•© $S_{2}$λŠ” $\dfrac{1}{2} {r_{1}}^2 \sin\theta_1 + \dfrac{1}{2} {r_{2}}^2 \sin\theta_2$κ°€ λ©λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ κ΅¬ν•˜κ³ μž ν•˜λŠ” ꡐ차 μ˜μ—­μ˜ 넓이 $S$λŠ” $S_{1}$μ—μ„œ $S_{2}$λ₯Ό λΊ€ κ°’μž…λ‹ˆλ‹€.

\[S_{1} = \dfrac{1}{2} {r_{1}}^2 \theta_1 + \dfrac{1}{2} {r_{2}}^2 \theta_2 \quad \quad S_{2} = \dfrac{1}{2} {r_{1}}^2 \sin\theta_1 + \dfrac{1}{2} {r_{2}}^2 \sin\theta_2\] \[S = S_{1} - S_{2} = \dfrac{1}{2} {r_{1}}^2 \theta_1 + \dfrac{1}{2} {r_{2}}^2 \theta_2 - \dfrac{1}{2} {r_{1}}^2 \sin\theta_1 + \dfrac{1}{2} {r_{2}}^2 \sin\theta_2\]

이λ₯Ό μ •λ¦¬ν•˜λ©΄ $S = \dfrac{1}{2} {r_{1}}^2 \left( \theta_1 - \sin\theta_1 \right) + \dfrac{1}{2} {r_{2}}^2 \left( \theta_2 - \sin\theta_2 \right) $ λΌλŠ” κΉ”λ”ν•œ 곡식을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

κ΅¬ν•œ 곡식을 κ΅¬ν˜„ν•˜κΈ°λ§Œ ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

전체 μ½”λ“œ

#include <iostream>
#include <cmath>
using namespace std;

const double PI = acos(-1);

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    double x1, y1, r1, x2, y2, r2;
    cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;

    double dx = x1 - x2;
    double dy = y1 - y2;
    double d = sqrt(dx*dx + dy*dy);
    double S;

    if(d >= r1 + r2) S = 0;
    else if(d <= abs(r1 - r2)) S = PI * pow(min(r1, r2), 2);
    else {
        double angle1 = 2 * acos((r1*r1 + d*d - r2*r2) / (2*r1*d));
        double angle2 = 2 * acos((r2*r2 + d*d - r1*r1) / (2*r2*d));

        double area1 = 0.5 * r1*r1 * (angle1 - sin(angle1));
        double area2 = 0.5 * r2*r2 * (angle2 - sin(angle2));

        S = area1 + area2;
    }

    cout.precision(3);
    cout << fixed << S << '\n';
    return 0;
}

Comments