개념
좌표자체를 배열의 idx로 활용하는 경우가 많다.
하지만 불가능한 경우가 있다.
- 음수좌표 --> 범위가 너무 넓음에 포함됨
- 범위가 너무 넓음
결국 좌표의 범위가 너무 넓어 배열에 다 담을 수 없을 때
주어진 좌표만을 사용하도록 하기 위한 방법이 좌표 압축이다.
좌표압축 알고리즘
1. 좌표 저장 - 입력순서(idx), 좌표(pos)
2. 좌표 정렬 - 좌표(pos) 기준, 좌표같을 땐 입력(idx) 기준
3. 좌표 압축
코드
void compression() { int before = arr[0].pos; int cnt = 0; answer[arr[0].idx] = 0; for (int i = 0; i < N; i++) { if (before != arr[i].pos) { before = arr[i].pos; cnt++; } answer[arr[i].idx] = cnt; } } int main() { scanf("%d", &N); //1. 좌표 저장(idx,pos) for (int i = 0; i < N; i++) { scanf("%d", &arr[i].pos); arr[i].idx = i; } //2. 좌표 정렬 mSort(0, N - 1); //3. 좌표 압축 compression(); for (int i = 0; i < N; i++) printf("%d ", answer[i]); return 0; }
예제
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
반응형
'Algorithm_library > common' 카테고리의 다른 글
Recursive 기본 구조 (0) | 2021.03.13 |
---|