[18870 - JAVA] 좌표 압축

2024. 5. 8. 07:24Algorithm

 

문제

 

수직선 위에 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

 

문제 힌트

 

5개 숫자 중 2보다 작은 개수 4보다 작은 개수 -10보다 작은 개수....

 

처음 풀이
import java.io.*;
import java.util.*;

class Main {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        int[] x = new int[n];
        TreeSet<Integer> hashset = new TreeSet<>();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        for (int i = 0; i < n; i++) {
            int num = Integer.parseInt(st.nextToken());
            x[i] = num;
            hashset.add(num);
        }

        System.out.println(hashset);
        
        for (int i = 0; i < n; i++) {
            int num = x[i];
            int count = hashset.headSet(num).size();
            sb.append(count).append(" ");
        }
        
        System.out.print(sb.toString());
    }
}

 

이 문제에서 중요한 부분이 정렬과 중복 체크라고 생각했고 TreeSet의 경우 정렬과 중복 제거를 제공하기 때문에 사용하였다. 그러나 하단 반복문에서 hashSet의 큰 문제가 발생해 시간초과가 발생한다. 예제 같이 짧은 경우 모든 배열을 탐색하는데 오랜시간이 걸리지 않지만 배열의 크기가 커질 수 록 탐색 시간이 오래걸린다.

 

두번째 풀이

 

import java.io.*;
import java.util.*;

class Main {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        HashMap<Integer, Integer> hashmap = new HashMap();
        int[] x = new int[n];
        int[] sortList = new int[n];
        int count = 0;
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        for (int i = 0; i < n; i++) {
            x[i] = Integer.parseInt(st.nextToken());
            sortList[i] = x[i];
        }

        Arrays.sort(sortList);

        for (int sortnum : sortList) {
            if (!hashmap.containsKey(sortnum)) {
                hashmap.put(sortnum, count);
                count++;
            }
        }
        
        for (int key : x) {
            sb.append(hashmap.get(key)).append(" ");
        }

        System.out.println(sb);
    }
}

 

HashMap으로 값을 카운팅하는 방식으로 처리해 키값으로 count한 값을 출력하는 방식

'Algorithm' 카테고리의 다른 글

[2630 - JAVA] 색종이 만들기  (0) 2024.05.24
[12015 - JAVA] 가장 긴 증가하는 부분 수열 2  (0) 2024.05.12
[11660 - JAVA] 구간 합 구하기 5  (1) 2024.03.23
[10986 - JAVA] 나머지 합  (2) 2024.03.23
[2559 - JAVA] 수열  (0) 2024.03.21