
function solution(strings, n) {
return strings.sort((a, b) => {
if (a[n] > b[n]) return 1;
if (a[n] < b[n]) return -1;
if (a[n] === b[n]) return (a > b) ? 1 : -1
})
}
나의 풀이 뿐만 아니라 대부분의 풀이가 sort() 메서드의 동작 방식을 토대로 작성되었다. 그동안은 그냥 sort(), 혹은 오름차순으로 정렬할 때에는 sort((a, b) => a - b), 내림차순으로 정렬할 때에는 sort((a, b) => b - a)라고 외워서 쓰곤 했다. 하지만 이 문제는 그런 식으로는 풀리지 않기 때문에 MDN Array.prototype.sort()을 읽으며 어떻게 풀어야할지 고민하고 코드를 작성하였다.
Sort()Sort()는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환한다. 원 배열이 정렬되며, 복사본이 만들어지는 것이 아니다. 정렬 순서는 문자열의 유니코드 코드 포인트를 따르며 아래와 같이 작성한다.
arr.sort([compareFunction])
매개변수인 compareFunction은 정렬 순서를 정의하는 함수로서, 생략하면 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 정렬된다.
compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬된다. a와 b가 비교되는 두 요소라면,
compareFunction(a, b)의 반환 값이 0보다 작은 경우: a를 b보다 낮은 색인으로 정렬. 즉, a가 먼저 옴.compareFunction(a, b)의 반환 값이 0인 경우: a와 b를 서로에 대해 변경하지 않음.compareFunction(a, b)의 반환 값이 0보다 큰 경우: b를 a보다 낮은 인덱스로 졍렬. 즉, b가 먼저 옴.function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1; // a가 먼저 오게 됨
}
if (a is greater than b by the ordering criterion) {
return 1; // b가 먼저 오게 됨
}
// a must be equal to b
return 0; // 서로에 대해 정렬되지 않고 다른 요소에 의해 정렬됨
}
다시 문제 풀이로 돌아와서, 반환 값이 0과 같거나 크고 작은 것을 활용하여 풀어야겠단 생각을 했다.
a 문자열의 n번째 인덱스의 값이 b 문자열의 n번째 인덱스의 값보다 큰 경우, b 문자열이 먼저 정렬되어야 한다. 즉, 반환 값은 0보다 큰 값을 가져야한다.
if (a[n] > b[n]) return 1;
// 예) a = "sun", b = "car", n = 1
// a[n] = "u", b[n] = "a"
// -> b 문자열이 먼저 정렬되어야 함
a 문자열의 n번째 인덱스 값이 b 문자열의 n번째 인덱스 값보다 작은 경우, a 문자열이 먼저 정렬되어야 한다. 즉, 반환 값은 0보다 작은 값을 가져야 한다.
if (a[n] < b[n]) return -1;
// 예) a = "abcd", b = "cdx", n = 2
// a[n] = "c", b[n] = "x"
// -> a 문자열이 먼저 정렬되어야 함
a 문자열의 n번째 인덱스 값과 b 문자열의 n번째 인덱스 값이 같은 경우에는 a 문자열 자체와 b 문자열 자체를 비교하여 정렬되어야 한다. 따라서 삼항연산자를 사용하여, a 문자열이 먼저 와야 하는 경우(a의 값이 더 작은 경우)와 b 문자열이 먼저 와야 하는 경우(b의 값이 더 작은 경우) 나누어 코드를 작성한다.
if (a[n] === b[n]) return (a > b) ? 1 : -1
// 예) a = "abce", b = "abcd", n = 2
// a[n] = "c", b[n] = "c"
// 이 상황에선 a 문자열과 b 문자열 자체를 비교하여 정렬해야 함.
sort() 메서드를 드디어 이해하게 되었다. sort() 메서드의 매개변수에 어떠한 것이 들어가야하는지, 반환값에 따른 정렬의 차이를 알게 되었다.