[코딩테스트] sort를 이용한 이차원 배열 정렬하기

LMH·2022년 12월 29일

배열의 내장객체인 sort를 이용하여 이중배열을 조건에 따라 정렬하는 문제를 정리하겠습니다.

문제

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

제한사항

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

풀이

numlist의 요소에 n을 뺀 후 그 절대값과 요소들을 하나의 배열에 추가합니다.
예를 들어 numlist가 [10000,20,36,47,40,6,10,7000] 이고 n이 30인 경우에 변수 temp의 값은 다음과 같은 이차원 배열의 형태입니다.

[ [ 9970, 10000 ], [ 10, 20 ], [ 6, 36 ], [ 17, 47 ], [ 10, 40 ], [ 24, 6 ], [ 20, 10 ], [ 6970, 7000 ] ]

첫 번째로 배열의 각 요소가 갖는 인덱스 0번째 요소의 값에 따라 정렬을 해야합니다.

    temp.sort((a, b) => a[0] - b[0])

[ [ 6, 36 ], [ 10, 20 ], [ 10, 40 ], [ 17, 47 ], [ 20, 10 ], [ 24, 6 ], [ 6970, 7000 ], [ 9970, 10000 ] ]

위에서 첫번째 요소를 비교하여, 첫번째 값을 기준으로 오름차순으로 정렬이 되었습니다. 그러나 첫번째 요소의 값이 같은 경우 두번째 요소의 값을 내림차순으로 정렬해야합니다. 이런 경우 '||' 연산자를 사용할 수 있습니다.

    temp.sort((a, b) => a[0] - b[0] || b[1] - b[1])

[ [ 6, 36 ], [ 10, 40 ], [ 10, 20 ], [ 17, 47 ], [ 20, 10 ], [ 24, 6 ], [ 6970, 7000 ], [ 9970, 10000 ] ]

정렬이 완료되면 최종적으로 배열의 두번째 요소를 담은 새로운 배열을 만들어 반환합니다.

아래는 최종 완성 코드입니다.

function solution(numlist, n) {
    cosnt temp = numlist.map((el) => [Math.abs(el-n), el] )
    const result = [];
    // a배열안의 각 배열의 0번인덱스를 오름 차순으로 먼저 정렬하고 앞의 정렬이 훼손되지 않는 범위내에서 1번인덱스를 내림 차순으로 정렬합니다.
    temp.sort((a, b) => a[0] - b[0] || b[1] - a[1])
    
    for(let el of temp) {
        result.push(el[1])
    }
    return result;
    
}

자바스크립트 내장 메소드(sort)

자바스크립트의 sort 메소드는 배열의 요소들을 문자열로 변환하여 해당 시퀸스내 단위의 UTF-16 코드 값을 기준으로 오름차순(사전순)으로 정렬하는 정렬합니다.

다음과 같은 비교함수를 입력하면 원하는 방식으로 정렬이 가능합니다.

  • (a, b) => -1: 비교함수 반환 값이 0보다 작으면 a를 b보다 먼저 위치 시킵니다.
  • (a, b) => 1: 비교함수 반환 값이 0보다 크면 b를 a보다 먼저 위치 시킵니다.
  • (a, b) => 0 : 비교함수 반환 값이 0이면 a와 b의 위치를 변경하지 않습니다.

알파벳 순 오름차순 정렬하기

  • (a, b) => a < b ? -1 : 1
    a가 b보다 사전식 순서가 앞쪽이면 a가 앞으로 오도록 -1을 반환합니다. 그렇지 않으면 b가 앞으로오도록 1을 반환합니다.

정리

처음에 문제를 해결하려고 했을 때, 이차원 배열의 정렬의 방법을 몰라서 고민을 많이했던 문제입니다. sort와 논리 연산자 '||'를 이용하여 조건에 따라 정렬이 가능했습니다. 이 방법은 조금 더 복잡한 구조의 데이터를 원하는 형태로 변경하는데 활용할 수 있겠습니다.

profile
새로운 것을 기록하고 복습하는 공간입니다.

0개의 댓글