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

JavaScript로 단어·구두점 배열을 문장으로 조립하는 함수 만들기

문제 상황

이번 글에서는 단어와 구두점이 섞여 있는 배열을 입력받아, 하나의 자연스러운 문장으로 조립해 반환하는 JavaScript 함수를 작성해 보겠습니다. 함수는 반드시 아래 세 가지 규칙을 지켜야 합니다.

  • 단어 사이에는 항상 공백이 한 칸 있어야 한다.
  • 쉼표(,)와 왼쪽에 인접한 단어 사이에는 공백이 없어야 한다.
  • 문장 끝에는 마침표(.)가 정확히 하나만 있어야 한다.

예를 들어 ['hey', ',', 'and', ',', 'you']라는 배열이 주어졌다면, 최종 결과는 "hey, and, you."가 되어야 합니다.

예시 코드

const arr = ['hey', ',', 'and', ',', 'you'];
const buildSentence = (arr = []) => {
    let res = '';
    for(let i = 0; i < arr.length; i++){
        const el = arr[i];
        const next = arr[i + 1];
        if(next === ','){
            res += el;
        }else{
            if(!next){
                res += `${el}.`;
            }else{
                res += `${el} `;
            }
        }
    }
    return res;
};
console.log(buildSentence(arr));

코드 동작 원리

핵심 로직은 현재 요소(el)와 바로 다음 요소(next)를 비교하는 것입니다.

  • 다음 요소가 쉼표(,)라면, 현재 단어 뒤에 공백 없이 그대로 붙입니다. → 'hey,'
  • 배열의 마지막 요소(즉, next가 undefined)라면, 단어 뒤에 마침표를 붙여 문장을 종결합니다. → 'you.'
  • 그 외의 일반적인 경우에는 단어 뒤에 공백 한 칸을 추가합니다. → 'and '

이렇게 하면 쉼표 앞에는 불필요한 공백이 생기지 않고, 단어와 단어 사이에는 항상 공백이 유지되며, 문장은 마침표 하나로 깔끔하게 끝나게 됩니다.

실행 결과

hey, and, you.

마무리

이 접근 방식은 시간 복잡도 O(n)으로 배열을 한 번만 순회하면 되기 때문에 매우 효율적입니다. 실무에서는 join() 메서드와 정규식을 조합하거나, reduce()를 활용해 같은 결과를 더 선언적으로 구현할 수도 있습니다. 다만 위 예제처럼 다음 요소를 미리 확인하는 방식이 규칙을 가장 직관적으로 표현할 수 있다는 장점이 있습니다.