mun dev

[백준] 18870 좌표압축 자바(Java) 본문

알고리즘/백준

[백준] 18870 좌표압축 자바(Java)

mndev 2023. 6. 21. 16:02

문제설명

수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.

 

 

통과한 코드

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));
        StringBuilder sb=new StringBuilder();
        HashMap<Integer, Integer> rankMap = new HashMap<Integer, Integer>();//압축할 map

        int n =Integer.parseInt(br.readLine());

        int arr[] = new int[n];
        int arraySort[] = new int[n];
        int cnt = 0;
        StringTokenizer st=new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            arraySort[i]= arr[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(arraySort);

        for(int value : arraySort){
            if(!rankMap.containsKey(value)){
                rankMap.put(value,cnt);
                cnt++;
            }
        }

        for(int value : arr){
            sb.append(rankMap.get(value)).append(' ');
        }

        System.out.println(sb.toString());
    }
}