링크
https://www.acmicpc.net/problem/18870
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.
첫째 줄에 N이 주어진다.
둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.
첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.
5
2 4 -10 4 -9
2 3 0 3 1
6
1000 999 1000 999 1000 999
1 0 1 0 1 0
scanf("%d", &n);
arr = (int*)malloc(sizeof(int) * n);
result = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
memcpy(result, arr, sizeof(int) * n);
qsort(arr, n, sizeof(arr[0]), compare);
int compare(const void* first, const void* second) {
int a = *(const int*)first;
int b = *(const int*)second;
if (a > b)
return 1; //오름차순 정렬
else if (a < b)
return -1;
else
return 0;
}
int removeDuplicates(int arr[], int n) { //중복 제거 후 배열의 요소 갯수 리턴
if (n == 0) return 0;
int j = 0;
for (int i = 1; i < n; i++) {
if (arr[i] != arr[j]) {
j++;
arr[j] = arr[i];
}
}
return j + 1; //마지막인덱스 번호 + 1이 요소의 갯수이기 때문에 +1을 한 후 리턴
}
for (int i = 0; i < rn; i++) {
int index = binarySearch(arr, n, result[i]); //이진 검색 사용
if (index != -1)
result[i] = index;
}
int binarySearch(int arr[], int n, int key) { //이진검색 알고리즘
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == key)
return mid;
else if (arr[mid] < key)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* first, const void* second) {
int a = *(const int*)first;
int b = *(const int*)second;
if (a > b)
return 1; //오름차순 정렬
else if (a < b)
return -1;
else
return 0;
}
int binarySearch(int arr[], int n, int key) { //이진검색 알고리즘
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == key)
return mid;
else if (arr[mid] < key)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
int removeDuplicates(int arr[], int n) { //중복 제거 후 배열의 요소 갯수 리턴
if (n == 0) return 0;
int j = 0;
for (int i = 1; i < n; i++) {
if (arr[i] != arr[j]) { //
j++;
arr[j] = arr[i];
}
}
return j + 1; //마지막인덱스 번호 + 1이 요소의 갯수이기 때문에 +1을 한 후 리턴
}
int main() {
int n;
int* arr;
int* result;
int rn;
scanf("%d", &n);
arr = (int*)malloc(sizeof(int) * n);
result = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
memcpy(result, arr, sizeof(int) * n);
rn = n;
qsort(arr, n, sizeof(arr[0]), compare);
n = removeDuplicates(arr, n); //중복 제거 후 배열의 요소 갯수를 저장
for (int i = 0; i < rn; i++) {
int index = binarySearch(arr, n, result[i]); //이진 검색 사용
if (index != -1)
result[i] = index;
}
for (int i = 0; i < rn; i++)
printf("%d ", result[i]);
free(arr);
free(result);
return 0;
}