무엇을 구하나
평면 위 점 집합에서 가장 먼 두 점 사이 거리(지름, diameter) 를 구하는 것이
대표 문제다. 모든 쌍을 보면 \(O(N^2)\)인데, 회전하는 캘리퍼스(rotating
calipers) 는 이를 \(O(N)\)(볼록 껍질 계산 포함 \(O(N \log N)\))에 푼다.
핵심 관찰
가장 먼 두 점은 반드시 볼록 껍질의 정점이다. 내부 점이나 변 위의 점은
껍질의 꼭짓점보다 멀 수 없기 때문이다. 그래서 먼저 볼록 껍질을 구하고,
그 위에서만 찾으면 된다.
대척점(antipodal pair)
볼록 다각형의 한 변에 평행한 두 지지선(caliper) 으로 다각형을 양쪽에서
집는다고 상상하자. 한 변을 기준으로 가장 먼 정점은, 그 변에서 가장 멀리
떨어진(수직 거리 최대) 정점이다. 변을 다각형 둘레를 따라 한 칸씩 돌리면,
"가장 먼 정점"도 같은 방향으로 단조롭게 한 칸씩 따라 돈다.
핵심 단조성: 기준 변을 반시계로 돌리면 그에 대응하는 최원점도 반시계로만
움직인다. 절대 뒤로 가지 않는다.
이 단조성 덕분에 두 포인터가 둘레를 각각 한 바퀴씩만 돌면 모든 대척점 쌍
(서로 평행한 지지선으로 동시에 집히는 정점 쌍)을 \(O(N)\)에 훑는다. 지름은 이
대척점 쌍들 중 거리 최대다.
거리 비교는 외적으로
"어느 정점이 변에서 더 먼가"는 외적(삼각형 넓이의 두 배) 으로 판정한다.
변 \(\overrightarrow{p_i p_{i+1}}\)에 대해 정점 \(q\)의 수직 거리에 비례하는 양은
\(\text{cross}(p_{i+1} - p_i,\ q - p_i)\)이다. 이 외적이 더 커지는 동안 포인터를
전진시키면 최원점을 찾는다. 부동소수 없이 정수 외적으로 비교하므로 오차가
없다.
다른 문제로의 확장
회전하는 캘리퍼스는 지름 외에도 여러 최적화를 같은 단조 진행으로 푼다.
- 최소 너비(width): 다각형을 감싸는 평행선 쌍의 최소 간격.
- 최소 넓이 외접 직사각형: 한 변이 껍질의 한 변과 평행해야 함이 보장됨.
- 두 볼록 다각형 사이 최소/최대 거리.
공통점은 "껍질의 한 요소(변/정점)를 돌리면, 대응하는 최적 요소가 단조롭게
따라 돈다"는 단조성이다. 이 성질만 확인되면 두 포인터로 선형에 끝난다.