어떤 문제를 푸는가
평면 위 점들이 주어졌을 때, 그 모든 점을 포함하는 가장 작은 볼록 다각형
(볼록 껍질, convex hull)을 구합니다. 점들을 고무줄로 감쌌을 때 만들어지는
바깥 윤곽이라고 생각하면 됩니다. 지름(가장 먼 두 점), 최소 외접 도형, 충돌
영역 등 기하 문제의 기반입니다.
볼록이란
다각형이 볼록 하다는 것은, 경계를 따라 한 바퀴 돌 때 항상 같은 방향
(예: 계속 좌회전) 으로만 꺾인다는 뜻입니다. 어딘가에서 반대로 꺾이면(우회전)
오목한 부분이 생긴 것입니다. CCW(외적 부호)로 이 회전 방향을 판정합니다.
그라함 스캔 / 모노톤 체인의 아이디어
대표 알고리즘은 두 가지지만 원리는 같습니다: 점을 정렬한 뒤, 스택에 쌓아
가며 볼록을 깨는 점을 제거 합니다.
모노톤 체인(Andrew's monotone chain):
- 점들을 \(x\) 좌표(같으면 \(y\)) 기준으로 정렬한다.
- 왼쪽→오른쪽으로 훑으며 아래 껍질(lower hull) 을 만든다. 새 점을 추가할
때, 직전 두 점과 함께 보아 좌회전이 아니면(우회전/일직선) 직전 점을
스택에서 빼낸다. - 오른쪽→왼쪽으로 다시 훑으며 같은 방식으로 위 껍질(upper hull) 을 만든다.
- 둘을 이으면 전체 볼록 껍질.
왜 옳은가
볼록 껍질의 경계는 정렬 순서대로 보면 "한 방향으로만 꺾이는" 점들의 수열입니다.
스택에 점을 쌓다가 직전 세 점이 잘못된 방향(오목을 만드는 회전)을 이루면, 가운데
점은 껍질에 속할 수 없으므로 제거합니다. 이 과정을 거치면 스택에는 올바른 회전
방향을 유지하는 점들만 남아, 정확히 껍질의 한쪽 경계가 됩니다.
복잡도
| 단계 | 시간 |
|---|---|
| 정렬 | \(O(N \log N)\) |
| 스캔(각 점 한 번 push, 한 번 pop) | \(O(N)\) |
| 전체 | \(O(N \log N)\) |
정렬이 비용을 지배합니다. 각 점은 스택에 한 번 들어가고 최대 한 번 빠지므로
스캔 자체는 선형입니다.
경계 처리 — 일직선 위의 점
세 점이 일직선(CCW = 0)일 때 가운데 점을 껍질에 포함할지 말지 는 문제
정의에 따라 다릅니다. 보통은 제거(엄격한 볼록 껍질)하지만, "경계 위 점도
세라"는 문제면 포함합니다. 이 한 끗 차이가 정답을 가르므로 조건을 꼭 확인
하세요. 다음 강의에서 정수 안전 구현을 봅니다.