문제 개요
이번 글에서는 하나의 문장을 나타내는 문자열을 입력받아 정렬된 결과를 반환하는 JavaScript 함수를 작성해 보겠습니다.
입력 문자열의 각 단어에는 하나의 정수가 포함되어 있습니다. 함수는 가장 작은 숫자를 포함한 단어가 맨 앞에 오도록 배치하고, 이후에는 숫자가 커지는 순서(오름차순)대로 단어들을 정렬해야 합니다.
예제 코드
다음은 위 문제를 해결하는 전체 코드입니다.
const str = "is2 Thi1s T4est 3a";
const sortByNumber = (str = '') => {
const findNumber = (s = '') => s
.split('')
.reduce((acc, val) => +val ? +val : acc, 0);
const arr = str.split(' ');
const sorter = (a, b) => {
return findNumber(a) - findNumber(b);
};
arr.sort(sorter);
return arr.join(' ');
};
console.log(sortByNumber(str));
출력 결과
Thi1s is2 3a T4est
코드 동작 원리
코드가 어떤 방식으로 동작하는지 단계별로 살펴보겠습니다.
1. 단어에서 숫자 추출하기
findNumber 함수는 단어를 한 글자씩 분리한 뒤 reduce() 메서드를 사용해 숫자인 문자만 골라냅니다. 단일 자릿수(0~9)를 대상으로 하며, 문자를 숫자형으로 변환했을 때 유효한 값만 누적값으로 반환합니다.
2. 문장을 단어 배열로 변환
split(' ')을 사용해 공백을 기준으로 문장을 잘라 단어 배열을 만듭니다.
3. 정렬 기준 정의
sorter 비교 함수는 두 단어에서 각각 숫자를 추출한 뒤 그 차이를 반환합니다. 결과값이 음수면 첫 번째 단어가 앞에, 양수면 두 번째 단어가 앞에 위치하게 됩니다.
4. 정렬 후 다시 하나의 문자열로 결합
정렬이 완료된 배열을 join(' ')으로 공백을 사이에 두고 연결하여 최종 문자열을 반환합니다.
이처럼 각 단어에서 숫자만 추출해 비교 기준으로 삼으면, 별도의 복잡한 로직 없이도 Array.prototype.sort()를 활용해 원하는 순서대로 문장을 손쉽게 정렬할 수 있습니다.