
내가 생각했을때 문제에서 원하는부분
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다.
이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다.
정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
내가 이 문제를 보고 생각해본 부분
Arrays.stream(numlist).boxed()
기본형 int 배열을 객체 형태인 Integer 스트림으로 변환한다.
자바에서 자유로운 커스텀 정렬 조건을 적용하기 위해 스트림과 객체 변환을 사용한다.
int distA = Math.abs(a - n);와 int distB = Math.abs(b - n);
비교할 두 숫자 a와 b가 기준값 n으로부터 얼마나 떨어져 있는지 구한다.
이때 음수가 나올 수 있으므로 Math.abs()를 사용해 절대값으로 거리를 측정한다.
if (distA == distB) { return b.compareTo(a); }
두 숫자의 거리가 서로 같다면 문제의 조건에 따라 더 큰 숫자가 앞으로 오도록 내림차순 정렬한다.
return Integer.compare(distA, distB);
거리가 서로 다르다면 거리가 더 가까운(값이 작은) 숫자가 앞으로 오도록 오름차순 정렬한다.
.mapToInt(Integer::intValue).toArray()
정렬이 모두 끝난 Integer 객체들을 다시 원래의 기본형 int 배열로 변환하여 최종 결과를 완성한다.
Main150 클래스의 main 메서드
정렬 로직을 담은 Solution5 객체를 생성하고, 문제에서 제공한 입출력 예시 1번과 2번의 데이터를 직접 대입하여 실행 결과를 콘솔창에 출력한다.
코드로 구현
import java.util.Arrays;
class Solution {
public int[] solution(int[] numlist, int n) {
return Arrays.stream(numlist)
.boxed()
.sorted((a, b) -> {
int distA = Math.abs(a - n);
int distB = Math.abs(b - n);
if (distA == distB) {
return b.compareTo(a);
}
return Integer.compare(distA, distB);
})
.mapToInt(Integer::intValue)
.toArray();
}
}
프로그래머스 코드
package programmers.programmers2;
import java.util.Arrays;
// 프로그래머스 특이한 정렬
public class Main150 {
public static void main(String[] args) {
Solution5 sol = new Solution5();
// 입출력 예 #1
int[] numlist1 = {1, 2, 3, 4, 5, 6};
int n1 = 4;
int[] result1 = sol.solution(numlist1, n1);
System.out.println(Arrays.toString(result1));
// 입출력 예 #2
int[] numlist2 = {10000, 20, 36, 47, 40, 6, 10, 7000};
int n2 = 30;
int[] result2 = sol.solution(numlist2, n2);
System.out.println(Arrays.toString(result2));
}
}
class Solution5 {
public int[] solution(int[] numlist, int n) {
return Arrays.stream(numlist)
.boxed()
.sorted((a, b) -> {
int distA = Math.abs(a - n);
int distB = Math.abs(b - n);
if (distA == distB) {
return b.compareTo(a);
}
return Integer.compare(distA, distB);
})
.mapToInt(Integer::intValue)
.toArray();
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.