문자열 내 마음대로 정렬하기 (feat. JS sort 함수)
https://school.programmers.co.kr/learn/courses/30/lessons/12915
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제의 핵심은 `sort 함수`의 활용이라고 생각한다.
sort 함수의 기본 정렬 순서는 `유니코드 코드 포인트의 순서`를 따른다. 배열의 요소가 숫자 타입이라 할지라도 배열의 요소를 일시적으로 문자열로 변환한 후 유니코드 코드 포인트의 순서를 기준으로 정렬한다.
예를 들어, 문자열 '1'의 유니코드 코드 포인트는 U+0031, 문자열 '2'의 유니코드 포인트는 U+0032다. 이처럼 문자열 '1'의 유니코드 포인트 순서가 문자열 '2'의 유니코드 코드 포인트 순서보다 앞서므로 문자열 배열 ['2'. '1']을 sort 함수로 정렬하면 ['1', '2']로 정렬된다.
즉, js의 sort함수는 원소들을 문자열로 바꾼 뒤에 정렬을 하기 때문에 숫자 정렬에 적합하지 않다. 이러한 sort 함수의 특징 때문에 우리는 sort 함수를 커스터마이징해야한다.
arr.sort([compareFunction])에서 `[compareFunction]` 부분을 정의해야한다.
[compareFunction]을 작성할 때는 어떤 값을 반환하는지가 중요하다.
`숫자 값`을 반환해야 하는데, `0을 기준`으로 `3가지` 케이스로 나뉜다.
- 0보다 크다 / 0이다 / 0보다 작다
- 매개변수로 [a, b]를 받았고 반환 값이 0보다 큰 경우 :
그대로 [a, b]. a가 먼저온다. - 매개변수로 [a, b]를 받았고 반환 값이 0인 경우 :
그대로 [a, b]. a와 b의 위치를 그대로 둔다. - 매개변수로 [a, b]를 받았고 반환 값이 0보다 작은 경우 :
b가 먼저 온다. [b, a]가 된다.
즉, 변경은 -1에서만 일어난다.
sort((a, b) => b - a)에서 a와 b가 헷갈릴 수 있다. [1, 2, 3]이라는 배열이 있을 때, 첫 루프로 a에 2가 들어오고 b에 1이 들어온다. 즉, a, b의 알파벳 순서와는 반대로 들어온다. 이게 헷갈린다면 sort((next, prev) => prev - next)로 사용할 수 있다.
내 작성 코드
이해가 쉽도록 sort 함수의 매개변수로 a,b 대신 next,prev로 작성했다.
각 문자열의 n번째 글자를 기준으로 오름차순 정렬한다.
n번째 글자가 동일하다면, 전체 문자열을 사전 순으로 비교하여 오름차순 정렬한다.
function solution(strings, n) {
strings.sort((next,prev)=>{
if(next[n] > prev[n]) return 1;
if(prev[n] > next[n]) return -1;
if(next > prev) return 1;
if(prev > next) return -1;
return 0;
});
return strings;
}
참고자료
- 자바스크립트 딥다이브의 sort 함수 부분