본문 바로가기
TIL

[코테연습] 1331. Rank Transform of an Array

by 크라00 2024. 10. 2.

- 배열 / 해시테이블 / 정렬 문제

 

https://leetcode.com/problems/rank-transform-of-an-array/description/?envType=daily-question&envId=2024-10-02

 

- 문제분석

1. int[] arr 에 랜덤한 숫자가 담겨있다.

2. 해당 숫자를 Rank 로 가장 작은 순서대로 랭킹 번호를 매긴다.

3. 랭킹 번호를 int[] 로 리턴한다.

4. 동일한 번호일 경우, 동일한 랭킹번호로 출력한다.

 

- 문제풀이

1. int[] arr 의 숫자를 set 으로 중복을 제거한다.

1-1. set 초기화는 TreeSet 으로 하여 정렬할 수 있도록한다.

2. 오름차순으로 정렬된 set 을 map 에 담는다.

2-1. key는 원래 숫자로, value 는 순서 ( 등급 )  을 담는다.

3. 다시 int[] arr 를 반복문으로 반복한다.

3-1. int[] rank 배열에는 map.get(arr[i]) 로하여, 등급을 순서대로 담아 리턴한다.

 

class Solution {
    public int[] arrayRankTransform(int[] arr) {
        TreeSet<Integer> set = new TreeSet<>((o1, o2)->o1.compareTo(o2));
        for (int num : arr) {
            set.add(num);
        }
        Map<Integer, Integer> map = new HashMap<>();
        int idx = 1;
        for(int num : set) {
            map.put(num, idx++);
        }

        int[] rs = new int[arr.length];
        int i = 0;
        for (int num : arr) {
            rs[i++] = map.get(num);
        }
        
        return rs;
    }
}