정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
function solution(numlist, n) {
return numlist.sort((a, b) => {
let comA = Math.abs(a - n);
let comB = Math.abs(b - n);
if(comA == comB) {
return b - a;
} else {
return comA > comB ? 1 : -1;
}
})
}
sort()메서드는 비교 함수 (a, b)를 인수로 받는다. 배열의 두 원소 a, b를 비교하여 정렬 순서를 결정한다.
comA
와 comB
가 같으면 b - a
를 반환한다. 두 값이 같을 경우 더 큰 값이 앞에 오도록 하기 위함이다. comA
가 comB
보다 클 때 1을, 작을 때 -1을 반환한다. 이렇게 하면 comA
가 작을수록 배열의 앞쪽에 위치하게 된다. function solution(numlist, n) {
return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
Math.abs(a - n) - Math.abs(b - n)
의 차이를 계산하여 반환한다. b - a
를 반환하여 더 큰 값이 앞에 올 수 있도록 했다. if 조건문이 아니라 || 연산자로 표현할 수 있군요...! 위에서 내가 적은 코드를 더 간략하게 이렇게 줄일 수 있다는 것을 알게 되었따.
function solution(numlist, n) {
numlist.sort((a,b)=>{
let n1 = Math.abs(a-n),
n2 = Math.abs(b-n);
return n1 < n2 ? -1 : n1 === n2 ? a < b ? 1 : -1 : 1;
});
return numlist;
}
a, b와 n의 차이를 계산하는 것은 모두 Math.abs() 메서드를 사용해서 구하는 방식을 같이 사용했다.
내가 풀었던 방식과 비슷하지만 삼항연산자를 사용했다. 먼저 n1이 n2보다 작을 경우 -1을 반환하여 a가 b보다 앞에 오게 한다.
n과 n2가 같을 경우 a와 b를 비교한다.
n1이 n2보다 크면 1을 반환하여 b가 a보다 앞에 오게 한다.
문제 보자마자 '아 이건 sort()다...!'라는 생각이 들었다. Y언니가 고차함수 한 번 싹 정리하면 문제 풀 때 뭐로 풀어야 할지 보인다구 했는데... 정리 해야지 해야지 하고 아직 도전을 못하고 있네... 7월 내로... 🥹