문제 정보
- 문제: https://www.acmicpc.net/problem/2626
- 요약: 바다 위 N개 섬의 좌표가 주어질 때, 모든 섬을 포함하면서 착륙장으로부터 가장 먼 섬까지의 직선거리를 최소화하는 헬기착륙장의 위치(x, y 좌표)와 그 거리를 구합니다. 이는 점 집합의 최소 외접원(Minimum Enclosing Circle)을 찾는 문제입니다.
- 제한: 시간 1초, 메모리 128MB, 2 ≤ N ≤ 1,000, -30,000 ≤ 좌표 ≤ 30,000
입출력 형식/예제
| |
예제 설명:
- 5개 섬의 위치가 주어짐
- 최적 착륙장 위치: (1.0, 1.0)
- 이 위치에서 가장 먼 섬까지의 거리: 5.0
접근 개요
핵심 관찰
최소 외접원(MEC)의 성질:
- 경계 점: 원의 경계 위에는 최소 2개, 최대 3개의 점이 위치합니다
- 2개 점: 두 점을 지름의 양 끝으로 하는 원이 유일합니다
- 3개 점: 세 점을 지나는 외접원이 유일합니다 (일직선 제외)
- 재귀 구조: 한 점을 고정하면, 나머지 점들에 대한 더 작은 MEC 부분 문제로 분해
Welzl 알고리즘
랜덤화 선형 시간 알고리즘으로, 기대 시간복잡도 O(n)을 달성합니다:
| |
알고리즘 설계
기본 연산
1. 두 점 사이 거리
| |
2. 두 점을 지름으로 하는 원
| |
3. 세 점의 외접원
세 점 A, B, C의 외접원을 구하는 방법:
벡터를 이용한 계산:
| |
일직선 처리: 외적이 0에 가까우면 세 점이 일직선 위에 있으므로, 가장 먼 두 점을 지름으로 하는 원 사용
4. 점과 원의 관계 판정
| |
(부동소수점 오차 대비 작은 여유값 EPS 사용)
Welzl 재귀 함수
| |
복잡도
시간: O(n) 기대 시간복잡도
- 랜덤화된 입력에 대해 평균적으로 선형 시간
- 최악: O(n²) (매우 드문 경우)
공간: O(n) 재귀 스택 + 점 배열
구현
| |
코너 케이스 체크리스트
- 단일 점 (N=1): 반지름 0인 원 (단, 문제에서 N ≥ 2)
- 두 점 (N=2): 두 점의 중점이 중심, 두 점 사이 거리의 절반이 반지름
- 일직선 상 점들: 일직선 점 3개 감지 시 가장 먼 두 점으로 원 형성
- 정삼각형: 세 외접원 계산이 정확한지 확인
- 큰 좌표 범위: -30,000 ~ 30,000 범위의 좌표, 거리 계산에서 오버플로우 없음 (double 사용)
- 출력 정밀도: 소수점 셋째 자리까지 정확히 반올림 (setprecision(3))
- 부동소수점 오차: 원 내부 판정에 EPS = 1e-10 여유값 사용
제출 전 점검
- 입력 형식: N을 읽고 N개의 (x, y) 쌍 읽기
- 출력 형식: 중심 좌표 한 줄, 반지름 한 줄, 소수점 3자리
- 원 내부 판정: EPS 여유값으로 안정성 확보
- 세 점 외접원: 외적이 0에 가까운 일직선 경우 처리
- 랜덤 시드: 재현성을 위해 고정 시드 사용
- 부동소수점 정밀도: double 자료형으로 충분
참고자료/유사문제
- Emo Welzl의 원문 - 최소 외접원 기원 논문
- 백준 17399 - 트리 외심 - 기하 응용
- 백준 13310 - 먼 별 - 볼록껍질과의 조합
- CP-Algorithms: Minimum Enclosing Circle
- 쌍대성과 최소 외접원
![Featured image of post [Algorithm] C++ 백준 2626번: 헬기착륙장](/post/algorithm/2025-12-02-boj-2626-helicopter-landing-site-minenc-cpp-solution/wordcloud_hu_b756581c27418167.png)
![[Algorithm] C++ 백준 16496번: 큰 수 만들기](/post/algorithm/2025-12-02-boj-16496-largest-number-greedy-sorting-cpp-solution/wordcloud_hu_9f9372bd1ae0bc2e.png)
![[Algorithm] C++ 백준 1725번: 히스토그램](/post/algorithm/2025-12-02-boj-1725-histogram-maxarea-stack-cpp-solution/wordcloud_hu_a9b77b8cde0366cb.png)
![[Algorithm] C++ 백준 2626번: 헬기착륙장](/post/algorithm/2025-12-02-boj-2626-helicopter-landing-site-minenc-cpp-solution/wordcloud_hu_4445322990b006e3.png)
![[Algorithm] C++ 백준 4354번: 문자열 제곱](/post/algorithm/2025-12-02-boj-4354-string-power-period-kmp-cpp-solution/wordcloud_hu_cd8c6924b1ac5ab.png)
![[Algorithm] C++ 백준 7577번: 탐사](/post/algorithm/2025-12-02-boj-7577-exploration-difference-constraints-spfa-cpp-solution/wordcloud_hu_2a0dd3ac39086d6a.png)
![[Algorithm] C++ 백준 13310번: 먼 별](/post/algorithm/2025-12-02-boj-13310-distant-star-convex-hull-cpp-solution/wordcloud_hu_a2b702e9b0991507.png)
![[Algorithm] C++ 백준 17613번: 점프 - 구간 최대 점프넘버](/post/algorithm/2025-08-14-boj-17613-jump-range-maximum-jumpnumber-cpp-solution/wordcloud_hu_e727bd814c6dcdfb.png)
![[Algorithm] C++ 백준 13537번: 수열과 쿼리 1 - 오프라인 BIT](/post/algorithm/2025-08-14-boj-13537-sequence-and-queries-1-offline-bit-cpp-solution/wordcloud_hu_cbc1305f194d9d9e.png)