본문 바로가기

알고리즘/정렬

[백준 18870번] 좌표 압축 [JAVA]

https://www.acmicpc.net/problem/18870

 

 

 

 

 

1. 문제설명

X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력하는 문제

 

2.풀이

해당 문제를 확인하고 바로 점수 별로 rank를 매기면 된다 생각하였습니다.

 

중복을 제거하기 위해 Set을 사용하였고 Set을 통해 여과된 데이터를 ArrayList로 바꿔 Collections의 sort를 이용하여 정렬을 한 결과를 HashMap에 담아 해당 숫자를 키로 삼아 키를 입력하면 결과로 rank가 나오게 설계하였습니다.

 

출력같은 경우 System.out.println을 이용하면 시간 초과가 나기에 BufferWriter를 이용하여 출력하였습니다.

 

 

3.소스코드

public class Main{

    static int N;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringTokenizer st;
    static HashMap<String, String> map = new HashMap<>();
    static int [] arr;
    static int [] count;

    public static void main(String[] args) throws IOException {
        N = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        arr = new int[N];
        count = new int[N];
        Set<Integer> s = new HashSet<>();
        for(int i=0; i<N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        for(int i=0; i<N; i++){
            s.add(arr[i]);
        }
        ArrayList<Integer> arr_sort = new ArrayList<>(s);
        Collections.sort(arr_sort);
        int size = 0;
        HashMap<Integer, Integer> h = new HashMap<>();
        for (Integer integer : arr_sort) {
            h.put(integer, size);
            size++;
        }
        for(int i=0; i<N; i++){
            int count = h.get(arr[i]);
            bw.write(count + " ");
        }
        bw.flush();
        bw.close();
    }




}