BOJ 16313: Janitor Troubles - 최대 사각형 넓이 문제
문제 링크: https://www.acmicpc.net/problem/16313
문제 이해
주어진 네 개의 변의 길이로 만들 수 있는 사각형 중에서 최대 넓이를 구하는 문제입니다.
입력
- 네 개의 양의 정수: s1, s2, s3, s4 (변의 길이)
출력
- 만들 수 있는 최대 넓이 (상대오차 또는 절대오차 10^-6 이내)
예제
| 입력 | 출력 |
|---|---|
| 3 3 3 3 | 9 |
| 1 2 1 1 | 1.299038105676658 |
| 2 2 1 4 | 3.307189138830738 |
풀이 방법
핵심 원리: 브라마굽타 공식 (Brahmagupta’s Formula)
네 개의 변으로 만든 사각형 중 최대 넓이를 갖는 사각형은 원에 내접하는 사각형입니다.
원에 내접하는 사각형의 넓이는 다음 공식으로 계산됩니다:
$$A = \sqrt{(s-a)(s-b)(s-c)(s-d)}$$여기서:
- $a, b, c, d$ = 네 변의 길이
- $s = \frac{a+b+c+d}{2}$ = 반둘레 (semi-perimeter)
왜 원에 내접하는 사각형이 최대인가?
일반적인 사각형의 넓이 공식은:
$$A = \sqrt{(s-a)(s-b)(s-c)(s-d) - abcd \cdot \cos^2\left(\frac{\alpha + \gamma}{2}\right)}$$여기서 α와 γ는 마주보는 각입니다.
원에 내접하는 사각형은 마주보는 각의 합이 180°이므로:
$$\cos\left(\frac{\alpha + \gamma}{2}\right) = \cos(90°) = 0$$따라서 코사인 항이 0이 되어 넓이가 최대가 됩니다.
해결 코드
| |
예제 검증
예제 1: 정사각형 (3 3 3 3)
- 반둘레: s = (3+3+3+3)/2 = 6
- 넓이: √(3×3×3×3) = √81 = 9 ✓
예제 2: (1 2 1 1)
- 반둘레: s = 5/2 = 2.5
- 넓이: √(1.5 × 0.5 × 1.5 × 1.5) = √(1.6875) ≈ 1.299 ✓
예제 3: (2 2 1 4)
- 반둘레: s = 9/2 = 4.5
- 넓이: √(2.5 × 2.5 × 3.5 × 0.5) = √(10.9375) ≈ 3.307 ✓
알고리즘 분석
| 항목 | 내용 |
|---|---|
| 시간복잡도 | O(1) |
| 공간복잡도 | O(1) |
| 핵심 개념 | 기하학, 브라마굽타 공식 |
| 자료구조 | 없음 |
| 알고리즘 | 수학 공식 적용 |
수학적 증명
쿨론의 정리 (Ptolemy’s Theorem)
원에 내접하는 사각형 ABCD에 대해:
$$|AC| \cdot |BD| = |AB| \cdot |CD| + |AD| \cdot |BC|$$대각선과 각의 관계
원에 내접하는 사각형에서 마주보는 각의 합이 180°라는 성질로부터:
$$\cos(\alpha + \gamma) = -1$$이를 통해 코사인 항이 0이 되고, 최대 넓이 조건이 성립합니다.
실전 팁
- 정밀도: setprecision(15)로 충분한 소수점 자리수를 보장합니다.
- 부동소수점 오류:
fixed를 사용하여 고정 소수점 표기를 합니다. - 제약 조건: 2si < Σsj가 만족하면 항상 사각형을 만들 수 있습니다.
관련 알고리즘
- 헤론의 공식: 삼각형의 넓이를 세 변의 길이로 구하는 공식
- 코사인 법칙: 각도를 모를 때 삼각형의 변 계산
- 삼각형 부등식: 변의 길이 제약 조건
출처
- 문제: ICPC > Regionals > Europe > Northwestern European Regional Contest > Benelux Algorithm Programming Contest > BAPC 2018 J번
- 알고리즘 분류: 기하학 (Geometry), 수학 (Mathematics)
작성일: 2025-12-04
마지막 수정일: 2025-12-04
난이도: 🟡 중상
풀이 시간: 10분
![[Algorithm] C++ 백준 13182번 제비](/post/algorithm/2025-12-04-boj-13182-lottery-draw-expectation-cpp-solution/wordcloud_hu_6c18b6c0307518c2.png)
![[Algorithm] C++ 백준 17682번 Tents](/post/algorithm/2025-12-04-boj-17682-tents-combinatorics-cpp-solution/wordcloud_hu_2726d57ba0310c29.png)
![[Algorithm] C++ 백준 16481번 원 전문가 진우 - 방접원과 내접원의 관계](/post/algorithm/2025-12-03-boj-16481-excircle-incircle-geometry-cpp-solution/wordcloud_hu_ee675f3393f22f00.png)
![[Algorithm] C++ 백준 27533번 따로 걸어가기](/post/algorithm/2025-12-03-boj-27533-walk-separately-lindstrom-cpp-solution/wordcloud_hu_bcc1a69354c31bd3.png)
![[Algorithm] C++ 백준 17973번 : Quadrilaterals](/post/algorithm/2025-08-12-boj-17973-quadrilaterals-cpp-solution/wordcloud_hu_7ce9005a69e4212f.png)
![[Algorithm] C++ 백준 8464번: Non-Squarefree Numbers](/post/algorithm/2025-10-14-boj-8464-non-squarefree-numbers-cpp-solution/wordcloud_hu_4f80697d0be61606.png)
![[Algorithm] C++/Python 백준 9244번: 핀볼 - 스위프 라인](/post/algorithm/2025-08-14-boj-9244-pinball-line-sweep-cpp-python-solution/wordcloud_hu_c46629456317c6c9.png)
![[Algorithm] C++ 백준 13725번 - RNG](/post/algorithm/2025-08-12-boj-13725-rng-cpp-solution/wordcloud_hu_c359e6560ee53e.png)