문제 이해하기
소문자로만 구성된 문자열을 입력받아 알파벳 역순(내림차순)으로 정렬하는 JavaScript 함수를 작성해야 합니다. 즉, 'b'가 'a'보다 앞에 오고, 'c'가 'b'보다 앞에 오는 방식으로 정렬하는 것입니다.
예를 들어, 입력 문자열이 다음과 같다면 −
const str = "hello";
출력 결과는 다음과 같아야 합니다 −
const output = "ollhe";
구현 아이디어
핵심 접근 방식은 다음 세 단계로 요약할 수 있습니다.
- 문자열을 개별 문자로 분리해 배열로 만든다.
- 사용자 정의 비교 함수를 통해 내림차순으로 정렬한다.
- 정렬된 배열을 다시 하나의 문자열로 결합한다.
예제 코드
다음은 위 로직을 구현한 전체 코드입니다 −
const string = 'hello';
const sorter = (a, b) => {
const legend = [-1, 0, 1];
return legend[+(a < b)];
}
const reverseSort = str => {
const strArr = str.split("");
return strArr
.sort(sorter)
.join("");
};
console.log(reverseSort(string));
코드 동작 원리
각 부분이 어떻게 동작하는지 살펴보겠습니다.
1. split("")으로 문자열 분리
split("")은 문자열을 개별 문자 단위의 배열로 변환합니다. 예를 들어 "hello"는 ['h', 'e', 'l', 'l', 'o'] 배열이 됩니다.
2. sorter 비교 함수
sorter 함수는 두 문자를 비교하여 정렬 순서를 결정합니다. +(a < b) 표현식은 a가 b보다 작으면 true(즉, 1)를 반환하고, 그렇지 않으면 0 또는 false(즉, -1)에 해당하는 값을 반환합니다. legend 배열인 [-1, 0, 1]에서 해당 인덱스의 값을 가져오므로, 결과적으로 큰 문자가 앞에 오는 내림차순 정렬이 이루어집니다.
3. join("")으로 문자열 재조합
정렬이 완료된 문자 배열을 join("")으로 합쳐 최종 문자열을 만듭니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
ollhe
더 간결한 대안: localeCompare 활용
비교 로직을 직접 구현하지 않고 localeCompare 메서드를 사용하면 한 줄로 처리할 수 있습니다.
const reverseSort = str =>
str.split("").sort((a, b) => b.localeCompare(a)).join("");
console.log(reverseSort("hello")); // ollhe
b.localeCompare(a)처럼 인자 순서를 바꿔 호출하면 자동으로 내림차순 비교가 되며, 가독성도 뛰어나기 때문에 실무에서는 이 방식을 더 많이 사용합니다. 다만 대소문자가 섞인 문자열이라면 localeCompare에 옵션을 추가하거나 사전에 toLowerCase()로 정규화하는 것이 안전합니다.