카테고리 없음

151. Reverse Words in a String

JTB 2025. 10. 22. 16:08

난이도: 중간 (Medium)

링크: LeetCode 151

풀이 날짜: 2025/10/22

 

 

1. 문제 이해

입력 문자열 s는 공백이 포함될 수 있으며, 단어 단위로 뒤집어 출력해야 한다. 연속된 공백은 하나로 간주하며, 결과 문자열은 단어 사이에 한 칸 공백만 존재해야 한다.

 

2. 접근 방식 — 배열 + 내장 메서드 활용

  1. 문자열의 앞뒤 공백 제거: trim()
  2. 공백 기준으로 단어 배열 생성: split(/\s+/) (연속 공백 처리)
  3. 단어 배열 뒤집기: reverse()
  4. 배열을 다시 문자열로 변환: join(' ')

 

3. 풀이 코드

1. 배열 + 내장 메서드 활용(배열 + join)

var reverseWords = function(s) {
    return s.trim().split(/\s+/).reverse().join(' ')
};

 

  • 공백 제거 후 단어 배열을 reverse
  • join(' ')으로 한 번만 문자열 생성
  • 반복문 + +보다 효율적

2. 반복문 + 문자열 누적 - 내 풀이

var reverseWords = function(s) {
  const array = s.split(' ');  
  let result = ''  
  
  for(let i=array.length-1; i>=0; i--) {
    const char = array[i];    
    if(char !== '') {
     if(result === '') result += char
     else result += ' ' + char
    }
  }

  return result;
};
  • 반복문을 돌면서 문자열을 + 연산으로 계속 연결
  • 단어가 많을 경우 매번 기존 문자열 길이만큼 복사가 발생

문자열 + 연산 주의점 -> 문자열은 불변(immutable)

let result = '';
result += 'hello';
result += 'world'; // 새 문자열 생성, 기존 문자열 복사
  • 매번 기존 문자열 전체를 복사
  • 반복이 길어지면 복사량이 증가

시간 복잡도

  • n개의 단어, 평균 길이 k
  • 반복문에서 + 연산 시 총 복사량 ≈ k * (1 + 2 + … + n) = O(n² * k)
  • 하지만, join() 사용 시 한 번만 전체 생성 → O(n * k)

 

4. 시간 및 공간 복잡도

방법 시간 복잡도 공간 복잡도 설명
내장 메서드 활용 (trim+split+reverse+join) O(n) O(n) 배열 reverse 및 join 시 내부 최적화됨
반복문 + 문자열 연결 O(n²) O(n) + 연산으로 문자열을 계속 연결 → 길어질수록 비효율

포인트: 문자열을 반복해서 +로 연결하는 방법은 긴 문자열에서 비효율적이므로, 내장 메서드 활용 방식을 권장

 

5. 핵심 정리

  • trim()으로 앞뒤 공백 제거
  • /\s+/ 정규식으로 연속 공백 처리
  • reverse()join()으로 단어 순서 뒤집기
  • 반복문 + 문자열 연결 방식은 효율성 떨어짐

JavaScript에서는 내장 메서드를 적절히 조합하면, 문자열 단어 뒤집기를 효율적이고 간결하게 구현할 수 있다.