Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 문장의 단어를 길이순으로 정렬하는 방법

이번 글에서는 문장을 첫 번째이자 유일한 인수로 받아, 단어의 길이를 기준으로 재정렬하는 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를 함께 저장해 비교하는 방식이 더 안전하고 확실한 선택입니다.