알고리즘을 풀다가 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 함수의 반환 값에 따라 정렬을 수행한다.
반환 값에 따른 정렬
- compareFunction(a, b) < 0 : a, b 순서로 정렬
- compareFunction(a, b) = 0 : a, b 순서를 변경하지 않고 다른 요소들에 대한 정렬 수행
- 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