출처 : https://www.acmicpc.net/problem/18870
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > 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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
public class App {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Integer origin[] = new Integer[N]; // 원본 배열
Integer sorted[] = new Integer[N]; // 정렬할 배열
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); // rank를 매길 hashMap
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
// 정렬할 배열과 원본 배열에 값을 삽입
sorted[i] = origin[i] = Integer.parseInt(st.nextToken());
}
// 정렬할 배열의 정렬 수행
Arrays.sort(sorted);
int rank = 0;
for (int v : sorted) {
// 중복된 값은 삽입하지 않는다.
if (!map.containsKey(v)) {
map.put(v, rank);
rank++;
}
}
StringBuilder sb = new StringBuilder();
for (int key : origin) {
int ranking = map.get(key);
sb.append(ranking).append(' ');
}
System.out.println(sb);
}
}