본문 바로가기

언어/Javascript

Javascript sort 조건정렬과 reverse의 차이

728x90

알고리즘을 풀다가 sort((a, b) => b - a) 는 되는데 sort().reverse()는 안되는 이유가 궁금해서 찾아봤다.

 

function solution(citations) {
    let idx = 0
    citations.sort((a, b) => b - a)
    
    while (idx < citations.length && idx + 1 <= citations[idx]) {
        idx++
    }
    
    return idx
}

이 코드는 통과가 된다.

 

function solution(citations) {
    let idx = 0
    citations.sort().reverse()
    
    while (idx < citations.length && idx + 1 <= citations[idx]) {
        idx++
    }
    
    return idx
}

근데 이 코드는 실패한다.

 

아무리봐도 다른 게 없었단 말이야.

그래서 찾아보았다.


sort()

 

sort() 메서드는 배열을 정렬해 원 배열을 수정한다.

단, 문자열의 유니코드를 기준으로 정렬을 수행한다.

 

공식 문서에서 설명과 함께 아래 예시가 적혀있다.

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// Expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// Expected output: Array [1, 100000, 21, 30, 4]

 

위 내용에서 확인할 수 있듯이 sort() 메서드는 숫자를 똑바로 정렬하지 못한다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org

 

reverse()

 

reverse() 메서드는 배열의 순서를 뒤집어 원 배열을 수정한다.

 

공식 문서에서 설명과 함게 아래 예시를 볼 수 있다.

const array1 = ['one', 'two', 'three'];
console.log('array1:', array1);
// Expected output: "array1:" Array ["one", "two", "three"]

const reversed = array1.reverse();
console.log('reversed:', reversed);
// Expected output: "reversed:" Array ["three", "two", "one"]

// Careful: reverse is destructive -- it changes the original array.
console.log('array1:', array1);
// Expected output: "array1:" Array ["three", "two", "one"]

 

정리하면, array.sort().reverse()는 문자열에 대해서는 제대로 정렬을 수행할 수 있지만, 숫자에 대해서는 제대로 정렬하지 못할 수 있다.


compareFunction

 

Javascript sort() 메서드 공식 문서를 보면, 숫자 정렬을 원할 때 어떻게 해야하는지 설명되어있다.

 

정렬을 위해 compareFunction을 이용할 수 있다.

사용자가 compareFunction을 제공하면, sort() 메서드는 compare 함수의 반환 값에 따라 정렬을 수행한다.

 

반환 값에 따른 정렬

  1. compareFunction(a, b) < 0 : a, b 순서로 정렬
  2. compareFunction(a, b) = 0 : a, b 순서를 변경하지 않고 다른 요소들에 대한 정렬 수행
  3. compareFunction(a, b) > 0 : b, a 순서로 정렬

 

정렬에 대해 공식 문서에서 제공되는 코드

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

 

sort((a, b) => b - a)

 

숫자를 비교하기 위해서는 a - b 를 사용하여 정렬을 수행할 수 있다.

단, Infinity, NaN이 포함되어 있는 경우에는 문제가 발생한다.

function compareNumbers(a, b) {
  return a - b;
}
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function (a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

참고자료

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

 

Array.prototype.sort() - JavaScript | MDN

sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다. 정렬은 stable sort가 아닐 수 있습니다. 기본 정렬 순서는 문자열의 유니코드 코드 포인트를 따릅니다.

developer.mozilla.org