프로그래머스.특이한 정렬

남궁진 (jinvicky)·2026년 3월 30일

Problem


https://school.programmers.co.kr/learn/courses/30/lessons/120880

Solution


간만에 접근법에 도달한 문제였다. 1가지 로직을 빼먹은 것이 아쉬웠지만:)

주어진 숫자 n을 기준으로 n과의 거리가 가까운 순으로 숫자를 정렬해서 배열로 반환하는 문제다.

거리가 가까운 -> 값이 작은 -> TreeMap?
같은 거리인 요소가 여러 개일 때 -> List<>에 저장?
거리가 +일수도 -일수도? -> Math.abs()를 사용한 절댓값을 키로?
같은 거리를 가지는 요소들 중에서 큰 수부터 배열에 담아야 한대
-> 그러면 뒤에서부터 담으면 되지 않나?

함정

실제로 위와 같이 케이스를 정리해서 10개중 9개의 테스트를 통과했다.
마지막 예외 케이스는 gemini와 함께 풀었는데 numlist가 예를 들어서 [5,3] 순서로 들어오면 distance가 1인 리스트에 [5,3]이 쌓여서 역순으로 출력시 큰 수인 5부터 나오지 않기 때문이다.

따라서 내 로직이 성공하려면 num_list가 먼저 정렬되어야 한다.
주어진 숫자 n과의 거리가 가까운 순이기 때문에 정렬을 해도 풀이에 문제가 없다.

생각보다 자주 쓰는

list를 stream()을 사용해서 배열로 바꾸는 로직을 외워두면 좋다.

arrayList.stream().mapToInt(a->a).toArray()

Code


import java.util.*;

class Solution {
    public int[] solution(int[] numlist, int n) {
        Arrays.sort(numlist); // 실패의 원인
        TreeMap<Integer, List<Integer>> tMap = new TreeMap<>();
        List<Integer> arrayList = new ArrayList<>();
        
        for(int num : numlist) {
            int distance = Math.abs(n - num);
            List<Integer> list = tMap.getOrDefault(distance, new ArrayList<>());
            list.add(num);
            tMap.put(distance, list);
        }
        
        for(Map.Entry<Integer, List<Integer>> entry : tMap.entrySet()) {
            List<Integer> values = entry.getValue();
            for(int i = values.size() - 1; i >= 0; i--) {
                arrayList.add(values.get(i));
            }
        }
        
        return arrayList.stream().mapToInt(a->a).toArray();
    }
}
profile
문제를 차근차근 하나씩 해결하려고 합니다:)

0개의 댓글