문제 정보
- 문제 링크: 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 충족
코너 케이스 및 실수 포인트
| 케이스 | 설명 | 처리 방법 |
|---|---|---|
| 최소 입력 | N=1 또는 빈 입력 | 반복문 범위·예외 처리 확인 |
| 오버플로우 | 답이 $2^{31}$ 초과 가능 | long long (C++) 등 사용 |
참고 자료
관련 문제
- 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_5ea3af502f1957d3.webp)
![[Algorithm] C++ 백준 28489번 2048 게임 AI](/post/algorithm/2025-12-04-boj-28489-2048-game-cpp-solution/wordcloud_hu_9934e2c525f28688.webp)
![[Algorithm] C++ 백준 29200번: 문제 수 줄이기](/post/algorithm/2025-12-04-boj-29200-reducing-number-of-problems-cpp-solution/wordcloud_hu_22b205eb23bc3b61.webp)
![[Algorithm] C++ 백준 16481번 원 전문가 진우 - 방접원과 내접원의 관계](/post/algorithm/2025-12-03-boj-16481-excircle-incircle-geometry-cpp-solution/wordcloud_hu_11ad9613e157ebed.webp)
![[Algorithm] C++ 백준 27533번 따로 걸어가기](/post/algorithm/2025-12-03-boj-27533-walk-separately-lindstrom-cpp-solution/wordcloud_hu_d9ed4e66c12c9b11.webp)
![[Algorithm] C++ 백준 6567번: 팔찌](/post/algorithm/2025-12-03-boj-6567-let-it-bead-polya-cpp-solution/wordcloud_hu_5e2d60669aeb7c29.webp)
![[Algorithm] C++ 백준 16313번: Janitor Troubles](/post/algorithm/2025-12-04-boj-16313-janitor-troubles-geometry-brahmagupta-cpp-solution/wordcloud_hu_f1bb0964a165d5b9.webp)
![[Algorithm] C++ 백준 32231번: 재우의 삼수강](/post/algorithm/2025-12-20-boj-32231-jaewoos-third-retake-hyperbolic-geometry-cpp-solution/wordcloud_hu_81b6faea477f1638.webp)
![[Algorithm] C++ 백준 17441번: 파리채 만들기](/post/algorithm/2025-12-19-boj-17441-fly-swatter-making-green-theorem-cpp-solution/wordcloud_hu_2db62e8d39d1e73c.webp)
![[Algorithm] C++ 백준 12925번: Numbers](/post/algorithm/2026-01-30-boj-12925-numbers-matrix-exponentiation-cpp-solution/wordcloud_hu_c254298302da6b9f.webp)
![[Algorithm] C++ 백준 14853번: 동전 던지기](/post/algorithm/2025-12-19-boj-14853-coin-tossing-cpp-solution/wordcloud_hu_969d47d88d4ed5d7.webp)