풀이
- 파이썬으로 해결하면 정말 간단한 문제이고 간결한 코드로 해결되는데
- 역시 자바는 아직 익숙하지 않아 좀 코드가 긴 것 같다.
- 우선 해결 방법으로는 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();
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스, 자바] 문자열 밀기 (0) | 2024.03.19 |
---|---|
[프로그래머스, 자바] 배열 만들기 2 (3) | 2024.03.19 |
[프로그래머스, 자바] 배열 자르기 (0) | 2024.03.16 |
[프로그래머스, 자바] 배열 뒤집기, 문자열 뒤집기 (0) | 2024.03.16 |
[프로그래머스, 자바] 외계어 사전 (0) | 2024.03.15 |