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

LMH·2022년 12월 29일
0

배열의 내장객체인 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개의 댓글