알고리즘

[프로그래머스, 자바] 특이한 정렬

hminor 2024. 3. 19. 10:24

풀이

  • 파이썬으로 해결하면 정말 간단한 문제이고 간결한 코드로 해결되는데
  • 역시 자바는 아직 익숙하지 않아 좀 코드가 긴 것 같다.
  • 우선 해결 방법으로는 2차원 배열을 사용하던지, Map을 사용하면 좋을 것 같아서
  • 그냥 HashMap을 사용하여 접근하기로 함
  • 이후 n과 numlist에 있는 정수와의 차의 절댓값을 key로 하여 
  • 값이 있다면 기존 배열에 값을 추가하고
  • 없다면 배열을 생성후 값을 추가하기로 함
  • 이때 배열 생성하면서 초기값을 추가하고자 한다면 Arrays.asList()로 값을 추가하면 된다.
  • 만약 여러 개의 값일 경우에도 콤마(,)를 적용해서 값을 더 추가하면 된다.
  • 이후 dic에 있는 key 목록들을 조회하는 dic.keySet()을 정렬하기 위해 
  • 새롭게 배열을 생성 후 Collections로 정렬한 것을 for문으로 가져와서
  • 해당 key에 해당하는 value인 배열을 정렬 후 뒤집어서 큰 값부터 추가할 수 있도록 하기
  • 그리고 return 타입이 int[] 이기에 stream의 mapToInt를 사용해서 Integer를 intValue로 해주고 toArray()하여 해결.

 

 

import java.util.*;

class Solution {
    public int[] solution(int[] numlist, int n) {
        HashMap<Integer,ArrayList<Integer>> dic = new HashMap<>();
        ArrayList<Integer> result = new ArrayList<>();
        for (int num: numlist) {
            int x = Math.abs(num-n);
            if (dic.containsKey(x)) {
                ArrayList<Integer> li = dic.get(x);
                li.add(num);
            }
            else {
                ArrayList<Integer> li = new ArrayList<Integer>();
                li.add(num);
                dic.put(x,li);
            }
        }

        ArrayList<Integer> s_li = new ArrayList<>(dic.keySet());
        Collections.sort(s_li);
        for (Integer key: s_li) {
            if (dic.get(key).size() != 1) {
                Collections.sort(dic.get(key));
                Collections.reverse(dic.get(key));
            }
            ArrayList<Integer> li = dic.get(key);
            for (Integer num: li) {
                result.add(num);
            }

        }

        return result.stream().mapToInt(Integer::intValue).toArray();
    }
}