수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
- 좌표
- 값 / 좌표 압축
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, Integer> rankhashmap = new HashMap<Integer, Integer>();
int N = Integer.parseInt(br.readLine());
int arr[] = new int[N];
int sortedarr[] = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i=0; i<N; i++)
sortedarr[i] = arr[i] = Integer.parseInt(st.nextToken());
Arrays.sort(sortedarr);
int rank = 0;
for(int i : sortedarr) {
if(!rankhashmap.containsKey(i)) {
rankhashmap.put(i, rank);
rank++;
}
}
StringBuilder sb = new StringBuilder();
for(int key : arr)
sb.append(rankhashmap.get(key)).append(' ');
System.out.println(sb);
}
}
좌표 압축 유형의 문제이다. 이번 문제는 1차원 좌표에서 필요없는 공간을 줄이기 위해 좌표를 압축시키고 순위를 제공하는 문제이다.
HashMap을 사용하는데, map은 key와 value값을 사용한다. 이 두가지 요소에 실제 값과 순위 값, 두 값을 매칭시키기 편해서 사용한다.
이번 문제를 해결하면서 hashmap의 여러 메소드들, containsKey(), get(), put() 등에 대해 다시 한번 기억하고 배우는 계기가 됬다.