
https://school.programmers.co.kr/learn/courses/30/lessons/120880
간만에 접근법에 도달한 문제였다. 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()
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();
}
}