이번 글에서는 문장을 첫 번째이자 유일한 인수로 받아, 단어의 길이를 기준으로 재정렬하는 JavaScript 함수를 작성해 보겠습니다.
여기서 말하는 문장(sentence)이란 공백으로 구분된 여러 단어가 연결된 문자열을 의미합니다. 함수는 문장 내 단어들을 재배치하여 가장 짧은 단어(글자 수가 가장 적은 단어)가 맨 앞에 오고, 그 뒤로 점점 긴 단어들이 이어지도록 만들어야 합니다.
예를 들어 다음과 같은 입력 문자열이 있다고 가정해 보겠습니다.
const str = 'this is a string';
그렇다면 기대되는 출력 결과는 다음과 같습니다.
const output = 'a is this string';
구현 예제
다음은 위 요구 사항을 구현한 전체 코드입니다.
const str = 'this is a string';
const arrangeWords = (str = []) => {
const data = str.toLowerCase().split(' ').map((val, i)=> {
return {
str: val,
length: val.length,
index: i
}
})
data.sort((a,b) => {
if (a.length === b.length)
return (a.index - b.index)
return (a.length - b.length)
});
let res = '';
let i = 0;
while (i < data.length - 1)
res += (data[i++].str + ' ');
res += data[i].str;
return (res)
};
console.log(arrangeWords(str));
코드 동작 원리
이 코드의 동작 방식을 단계별로 살펴보겠습니다.
1. 전처리: 먼저 toLowerCase()로 문장 전체를 소문자로 변환한 뒤, split(' ')으로 공백을 기준으로 단어 배열로 나눕니다.
2. 객체 매핑: map()을 사용해 각 단어를 { str: 단어, length: 길이, index: 원래 순서 } 형태의 객체로 변환합니다. 원래 순서(index)를 함께 저장하는 이유는, 길이가 같은 단어끼리는 원래 등장 순서를 유지해야 하기 때문입니다.
3. 정렬: sort()를 이용해 길이 오름차순으로 정렬하되, 길이가 동일한 경우에는 index 값을 비교하여 원래 순서대로 배치합니다.
4. 문자열 조합: 정렬된 단어들을 공백으로 연결해 최종 결과 문자열을 만듭니다. 마지막 단어 뒤에는 불필요한 공백이 붙지 않도록 while 루프와 마지막 단어 처리를 분리했습니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
a is this string
마무리 및 참고 사항
참고로 Array.prototype.sort()는 ES2019(ES10)부터 안정 정렬(stable sort)이 표준으로 보장되므로, 최신 JavaScript 환경에서는 index를 명시적으로 저장하지 않아도 길이가 같은 단어들의 원래 순서가 자동으로 유지됩니다. 다만 구버전 브라우저나 Node.js 환경과의 호환성을 고려한다면, 위 코드처럼 index를 함께 저장해 비교하는 방식이 더 안전하고 확실한 선택입니다.