본문 바로가기
JavaScript

[프로그래머스 Lv.1] 문자열 내 마음대로 정렬하기 javascript

by 어느새벽 2024. 11. 6.
function solution(strings, n) {
    return strings.sort((a, b) => {
        // n번째 글자가 다르면 n번째 글자를 기준으로 정렬
        if (a[n] !== b[n]) {
            return a[n].localeCompare(b[n]);
        }
        // n번째 글자가 같으면 전체 문자열을 기준으로 정렬
        return a.localeCompare(b);
    });
}

 

이번문제에서도 localeCompare() 라는 메서드를 새로 알게 되었다.

referenceStr가 compareString 전 혹은 뒤에 오는지 또는 동등한지를 나타내는 정수를 반환합니다.

compareString 전에 referenceStr이 오면 음수
compareString 뒤에 referenceStr이 오면 양수
동등한 경우 0 을 반환합니다.

 

위에 mdn 문서를 봐도 이해하기 어려웠다. 또 보다 보니 sort() 메서드의 원리가 뭔지 제대로 모르겠어서 더 찾아봤다.

위에 문제를 토대로 다시 설명해보자.

 

1. sort 함수가 하는 일

sort 함수는 배열에 있는 두 개의 요소를 비교하면서 순서를 바꿔 배열을 오름차순이나 내림차순으로 정렬한다.

  • a와 b는 배열에서 서로 비교되는 두 개의 요소를 나타낸다.
  • 예를 들어 배열이 ["sun", "bed", "car"]라면 sort는 먼저 "sun"과 "bed"를 비교하고, 다음에는 "bed"와 "car"를 비교하는 식이다.

2. sort 함수의 원리

sort 함수는 두 요소를 비교하고, 그 비교 결과를 통해 배열 요소의 위치를 정한다.

  • a - b: 숫자를 정렬할 때 많이 쓰는데, a가 b보다 작으면 음수가 나와서 오름차순이 된다. (작은 수가 앞에 오도록)
  • 문자열을 정렬할 때는 localeCompare라는 방법을 사용한다. 이 함수는 문자 간의 사전 순서를 비교한다.

3. 예시를 통한 설명

지금 문제에서는 배열 ["sun", "bed", "car"]와 n = 1을 주었으니, 각 단어의 인덱스 1에 있는 글자를 기준으로 정렬해야 한다.
이제 sort가 배열의 요소들을 하나씩 두 개씩 짝지어 비교해 나가는 과정을 보면,

  1. "sun"과 "bed"를 비교한다.
    • n = 1이니까, "sun"의 인덱스 1 글자는 "u", "bed"의 인덱스 1 글자는 "e".
    • "e"가 "u"보다 앞에 있어야 하므로 "bed"가 "sun"보다 앞에 오게  한다.
  2. "bed"와 "car"를 비교한다.
    • "bed"의 인덱스 1 글자는 "e", "car"의 인덱스 1 글자는 "a".
    • "a"가 "e"보다 앞에 있어야 하니까 "car"가 "bed"보다 앞에 오게 한다.
  3. "sun"과 "car"를 비교.
    • 이제 "sun"과 "car"도 비교해서 "car"가 더 앞에 오도록 정렬한다.

최종 결과

이 과정을 통해 ["car", "bed", "sun"]이 되며, 각 단어의 인덱스 1 문자 기준으로 오름차순 정렬된 배열을 얻게 된다.