문제 설명
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
const strings = ["sun", "bed", "car"];
const n = 1;
function solution(strings, n) {
return strings.sort((a, b) => {
if (a[n] === b[n]) return (a > b) - (b > a);
return (a[n] > b[n]) - (b[n] > a[n]);
});
}
console.log(solution(strings, n));
📌 내가 생각한 로직
1. sort()
로 내림 차순을 한다.
2. 조건 1. string내 a의 [n]번째 글자와 string내 b의 [n]번째 글자가 동일 한 경우 (a > b) - (b > a)
를 한다.
(a > b) - (b > a)
// true - false 일때
1 - 0 = 1
// false - true 일떄
0 - 1 = -1
조건 2 그외의 조건은 (a[n] > b[n]) - (b[n] > a[n])
3. 해당 값 return
sort() 배열 정렬하기
arr.sort([compareFunction])
compareFunction
이 없다면 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 정렬됩니다. ( [80,9....]인 경우 숫자는 문자열로 변환 되어 80이 먼저 옴)- 반환 값 : 정렬한 배열 ( 기존 배열 복사 X / 기존 배열 정렬 O)
compareFunction
: 배열 요소는 compare 함수의 반환 값에 따라 정렬
compareFunction (a,b)
:
0보다 작은 경우 a가 b보다 우선 (-1) // false
0을 반환하면 a와 b q변경 없음 (0)
0보다 큰 경우 b가 a보다 우선 (1) // true- a와 b의 특정 쌍이 두개의 인수로 주어지는 경우 : 동일한 값을 반환 (불 일치시 정렬 순서 정의 하지 않음 )
function solution(strings, n) {
return strings.sort((s1, s2) => s1[n] === s2[n] ? s1.localeCompare(s2) : s1[n].localeCompare(s2[n]));
}
📌
localeCompare()
localeCompare(compareString)
참조 문자열이 정렬 순서에서 지정된 문자열의 앞이나 뒤에 오는지 또는 지정된 문자열과 동일한지 여부를 나타내는 숫자를 반환합니다.
compareString
: 비교 대상 문자열//return 'str'.localCompare('str'): 0 //동일한 경우 'a'.localCompare('b') : -1 //음수 'b'.localCompare('a') : 1 // 양수