문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
strings | n | return |
---|---|---|
[”sun”, “bed”, “car”] | 1 | [”car”, “bed”, “sun”] |
[”abce”, “abcd”, “cdx”] | 2 | [”abcd”, “abce”, “cdx”] |
입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
String.charCodeAt()
String.charCodeAt(n)
은 string의 n번째에 해당하는 문자열의 유니코드를 반환한다.
a의 n번째 문자열과 b의 n번째 문자열이 다를 경우 해당하는 유니코드를 기준으로 오름차순 정렬하고,
a의 n번째 문자열과 b의 n번째 문자열이 같을 경우는 사전순으로 앞선 문자열이 앞쪽에 위치해야 하므로 단어 자체를 오름차순 정렬하도록 했다.
function solution(strings, n) {
strings.sort((a, b) => {
if (a.charCodeAt(n) !== b.charCodeAt(n)) {
return a.charCodeAt(n) - b.charCodeAt(n);
} else {
return a > b ? 1 : (a < b ? -1 : 0);
}
});
return strings;
}
localeCompare()
sort()
메서드로 숫자를 정렬할 때는 오름차순일 경우 a-b
, 내림차순일 경우 b-a
로 매우 간단하지만, 문자열에는 적용이 안되어서 불편했는데 다른 사람들 풀이를 보다가 단비같은 메서드를 발견했다. String 내장 메서드인 localeCompare()
을 사용하면 if문 사용할 필요 없이 간편하게 문자열을 비교할 수 있다.
function solution(strings, n) {
return strings.sort((a, b) => a[n] === b[n] ? a.localeCompare(b) : a[n].localeCompare(b[n]));
}
arr.sort([compareFunction])
손에 익을수록 점점 동작 방식을 잊고 사용하게 된다.
sort 함수의 콜백 함수인 [compareFunction]
이 반환하는 값에 따라 정렬하는데, 이 값은 세 가지로 나눌 수 있다. 매개변수로 (a, b)를 받았다고 생각했을 때,
- 양수 반환 => (a, b) 로 a가 먼저 온다.
- 0 반환 => (a, b) 로 a와 b의 위치가 유지된다.
- 음수 반환 => (b, a) 로 b가 먼저 온다.
음수를 반환한 경우에만 a와 b의 위치가 변경된다.
localeCompare()
메서드는 정렬순서에 따라 문자열을 비교하여 숫자를 반환한다.
localeCompare(compareString)
localeCompare(compareString, locales)
localeCompare(compareString, locales, options)
// sort() + localeCompare()
strings.sort((a, b) => a.localeCompare(b));
Examples
// sort()
function solution(strings, n) {
return strings.sort((a, b) => {
if (a[n] < b[n]) return -1;
else if (a[n] > b[n]) return 1;
else return 0;
})
}
// sort() + localeCompare()
function solution(strings, n) {
return strings.sort((a, b) => a[n].localeCompare(b[n]));
}
sort()
함수의 동작 방식을 다시 익혔다.localeCompare()
를 사용하면 [compareFunction]
를 따로 만들 필요가 없다.