[js] 특이한 정렬

sookyoung.k·2024년 6월 28일
1
post-thumbnail

정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ n ≤ 10,000
  • 1 ≤ numlist의 원소 ≤ 10,000
  • 1 ≤ numlist의 길이 ≤ 100
  • numlist는 중복된 원소를 갖지 않습니다.

나의 풀이

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를 비교하여 정렬 순서를 결정한다.

  1. Math.abs()를 사용해서 기준값 n과 a, b가 얼마나 떨어져있는 지를 계산한다.
  2. comAcomB가 같으면 b - a를 반환한다. 두 값이 같을 경우 더 큰 값이 앞에 오도록 하기 위함이다.
  3. 다르다면 comAcomB보다 클 때 1을, 작을 때 -1을 반환한다. 이렇게 하면 comA가 작을수록 배열의 앞쪽에 위치하게 된다.

다른 풀이 1

function solution(numlist, n) {
  return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a);
}
  1. a와 b의 n과의 차이의 절대값을 비교한다. Math.abs(a - n) - Math.abs(b - n)의 차이를 계산하여 반환한다.
  2. 양수라면 b가 a보다 앞에 오고, 음수라면 a가 b보다 앞에 올 것이다. 차이가 같으면 0을 반환한다.
  3. 0이라면 b - a를 반환하여 더 큰 값이 앞에 올 수 있도록 했다.

if 조건문이 아니라 || 연산자로 표현할 수 있군요...! 위에서 내가 적은 코드를 더 간략하게 이렇게 줄일 수 있다는 것을 알게 되었따.

다른 풀이 2

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;
}
  1. a, b와 n의 차이를 계산하는 것은 모두 Math.abs() 메서드를 사용해서 구하는 방식을 같이 사용했다.

  2. 내가 풀었던 방식과 비슷하지만 삼항연산자를 사용했다. 먼저 n1이 n2보다 작을 경우 -1을 반환하여 a가 b보다 앞에 오게 한다.

  3. n과 n2가 같을 경우 a와 b를 비교한다.

    • a가 b보다 작을 경우 1을 반환하여 b가 앞에 오게 한다.
    • 그렇지 않으면 -1을 반환하여 a가 앞에 오게 한다.
  4. n1이 n2보다 크면 1을 반환하여 b가 a보다 앞에 오게 한다.


문제 보자마자 '아 이건 sort()다...!'라는 생각이 들었다. Y언니가 고차함수 한 번 싹 정리하면 문제 풀 때 뭐로 풀어야 할지 보인다구 했는데... 정리 해야지 해야지 하고 아직 도전을 못하고 있네... 7월 내로... 🥹

profile
영차영차 😎

0개의 댓글