문제 정보
- 문제 링크: https://www.acmicpc.net/problem/16481
- 난이도: Silver III
- 분류: 수학, 기하학
- 시간 제한: 1초 (추가 시간 없음)
- 메모리 제한: 512 MB
문제 요약
평면에 있는 삼각형 ABC의 서로 다른 위치에 있는 세 방접원의 반지름의 길이가 r1, r2, r3일 때, 삼각형 ABC의 내접원의 반지름을 구하는 문제입니다.
입력: r1, r2, r3 (1,000 이하의 양의 정수)
출력: 내접원의 반지름 (절대/상대 오차 10^-6 허용)
입출력 예제
| |
| |
접근 방법
핵심 수학 공식 유도
삼각형의 기하학적 특성을 활용하여 방접원과 내접원의 관계를 유도합니다.
기본 정의:
- 삼각형의 넓이: K
- 반둘레: s = (a + b + c) / 2
- 내접원 반지름: r = K / s
- 방접원 반지름:
- r_a = K / (s - a)
- r_b = K / (s - b)
- r_c = K / (s - c)
관계식 유도:
각 방접원 반지름의 역수를 구하면:
- 1/r_a = (s - a) / K
- 1/r_b = (s - b) / K
- 1/r_c = (s - c) / K
이들을 모두 더하면:
| |
따라서 최종 공식은:
$$r = \frac{1}{\frac{1}{r_1} + \frac{1}{r_2} + \frac{1}{r_3}}$$복잡도 분석
- 시간 복잡도: O(1) - 단순 수학 계산
- 공간 복잡도: O(1) - 상수 개의 변수만 사용
풀이 코드
| |
알고리즘 설명
1단계: 입력 처리
세 방접원의 반지름 r1, r2, r3을 입력받습니다.
2단계: 내접원 반지름 계산
유도한 공식을 적용합니다:
- 1/r1 + 1/r2 + 1/r3을 먼저 계산
- 그 역수가 내접원의 반지름
3단계: 출력
소수점 10자리까지 출력하여 오차 조건(10^-6)을 만족시킵니다.
예제 검증
예제 1: r1 = r2 = r3 = 4
- 계산: r = 1 / (1/4 + 1/4 + 1/4) = 1 / (3/4) = 4/3 = 1.3333…
예제 2: r1 = 18, r2 = 13, r3 = 14
- 계산: r = 1 / (1/18 + 1/13 + 1/14)
- 1/18 + 1/13 + 1/14 = (13×14 + 18×14 + 18×13) / (18×13×14)
- = (182 + 252 + 234) / 3276
- = 668 / 3276
- r = 3276 / 668 ≈ 4.904191617
코너 케이스 체크리스트
- 세 방접원 반지름이 모두 같은 경우 (정삼각형)
- 방접원 반지름이 최소값(1)인 경우
- 방접원 반지름이 최대값(1000)인 경우
- 부동소수점 정밀도 처리
수학적 배경
방접원(Excircle)이란?
방접원은 삼각형의 한 변에 접하고, 나머지 두 변의 연장선에 접하는 원입니다. 삼각형에는 세 개의 방접원이 존재합니다.
내접원(Incircle)이란?
내접원은 삼각형의 세 변 모두에 내접하는 원입니다. 삼각형에는 정확히 하나의 내접원이 존재합니다.
기하학적 관계
방접원과 내접원의 반지름 사이의 관계식은 삼각형의 넓이와 반둘레를 통해 유도됩니다. 이 문제는 이러한 기하학적 관계를 활용하여 효율적으로 해결할 수 있습니다.
제출 전 점검
- 입출력 형식 확인
- 부동소수점 정밀도 (10자리 출력)
- double 자료형 사용
- 오차 범위 10^-6 충족
참고 자료
관련 문제
- BOJ 1085: 직사각형에서 탈출
- BOJ 3053: 택시 기하학
- BOJ 1002: 터렛
![Featured image of post [Algorithm] C++ 백준 16481번 원 전문가 진우 - 방접원과 내접원의 관계](/post/algorithm/2025-12-03-boj-16481-excircle-incircle-geometry-cpp-solution/wordcloud_hu_44a44948fa847f87.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++ 백준 6567번: 팔찌](/post/algorithm/2025-12-03-boj-6567-let-it-bead-polya-cpp-solution/wordcloud_hu_9f7bf9b3b4a09b24.png)
![[Algorithm] C++/Python 백준 12771번: Oil](/post/algorithm/2025-08-14-boj-12771-oil-maximum-extraction-slope-sweep/wordcloud_hu_8874e7bcb7c63c40.png)
![[Algorithm] C++/Python 백준 8885번: Pirate Chest - 수면 상승 고려 최대 체적](/post/algorithm/2025-08-14-boj-8885-pirate-chest-water-displacement-cpp-python-solution/wordcloud_hu_1abdc5a31effc773.png)
![[Algorithm] C++ 백준 31397번: 반 나누기 (Hard)](/post/algorithm/2025-08-14-boj-31397-half-cut-hard-cpp-solution/wordcloud_hu_b1eb425725154c8b.png)
![[Algorithm] C++/Python 백준 9244번: 핀볼 - 스위프 라인](/post/algorithm/2025-08-14-boj-9244-pinball-line-sweep-cpp-python-solution/wordcloud_hu_c46629456317c6c9.png)
![[Algorithm] C++ 백준 7626번: 직사각형](/post/algorithm/2025-09-16-boj-7626-rectangles-union-area-line-sweep-segment-tree-cpp-solution/wordcloud_hu_a4f83acea5a7ea04.png)