좌표 압축이란?
좌표 압축(coordinate compression) 은 실제 값의 크기는 크지만 종류는 적을 때,
각 값을 정렬 순서(등수) 로 바꿔 작은 범위로 옮기는 전처리 기법입니다.
값이 \(10^9\)까지 가더라도 서로 다른 값이 \(N\)개(\(\le 10^5\))뿐이라면, 그 값들을
\(0, 1, 2, \dots, N-1\)로 다시 매겨도 대소 관계는 그대로 유지됩니다.
1. 왜 필요한가
세그먼트 트리, 누적 합, 배열 카운팅 같은 많은 기법은 값을 배열의 인덱스로
씁니다. 그런데 값이 \(10^9\)까지면 그 크기의 배열을 만들 수 없습니다(메모리 초과).
좌표 압축은 "값의 실제 크기는 중요하지 않고 상대적 순서만 중요하다"는 점을
이용해, 값들을 \(0 \sim N-1\) 범위로 눌러 배열 크기를 \(O(N)\)으로 줄입니다.
원래 값: [100, 50000, 7, 100, 99999999]
서로 다른 값 정렬: [7, 100, 50000, 99999999]
압축 결과: [1, 2, 0, 1, 3] (각 값의 등수)
2. 핵심 절차
좌표 압축은 세 단계로 끝납니다.
- 모든 값을 모아 정렬한다.
- 중복을 제거한다(서로 다른 값만 남김).
- 각 원래 값을, 정렬된 목록에서의 위치(인덱스) 로 바꾼다 — 이분 탐색으로
위치를 찾음.
대소 관계가 보존되므로, 압축 전후의 정렬·비교 결과가 동일합니다.
3. 복잡도
정렬 \(O(N \log N)\), 중복 제거 \(O(N)\), 각 값의 위치 찾기 \(O(\log N)\). 전체
\(O(N \log N)\)입니다. 이 한 번의 전처리로 이후 알고리즘이 작은 배열에서
동작할 수 있게 됩니다.
4. 대표 활용
| 상황 | 좌표 압축의 역할 |
|---|---|
| 값이 큰 세그먼트 트리 | 값을 인덱스로 → 트리 크기 \(O(N)\) |
| 역순쌍/순위 카운팅 | 값을 등수로 → 펜윅 트리 |
| 큰 좌표의 격자 | 등장하는 좌표만 압축 |
| 구간 스케줄/이벤트 | 시각을 등수로 |
특히 "값이 \(10^9\)인데 세그먼트 트리/펜윅을 쓰고 싶다"면 거의 항상 좌표 압축이
먼저 옵니다.
5. 주의: 순서만 보존, 거리는 잃는다
좌표 압축은 대소 관계만 보존합니다. 값들 사이의 실제 차이(거리) 는
사라집니다. 그래서 "두 값의 차"나 "구간의 실제 길이"가 필요한 문제에는
그대로 쓰면 안 됩니다 — 등수가 아니라 원래 값을 따로 보관해야 합니다.
정리
좌표 압축은 "값을 등수로" 바꿔 큰 값 범위를 \(O(N)\) 인덱스로 줄이는 전처리입니다.
정렬 → 중복 제거 → 이분 탐색으로 위치 찾기, 이 세 단계가 전부입니다. 세그먼트
트리·펜윅·카운팅의 단골 짝꿍입니다. 다음 강의에서 구현합니다.