카테고리 없음
151. Reverse Words in a String
JTB
2025. 10. 22. 16:08
난이도: 중간 (Medium)
링크: LeetCode 151
풀이 날짜: 2025/10/22
1. 문제 이해

입력 문자열 s는 공백이 포함될 수 있으며, 단어 단위로 뒤집어 출력해야 한다. 연속된 공백은 하나로 간주하며, 결과 문자열은 단어 사이에 한 칸 공백만 존재해야 한다.
2. 접근 방식 — 배열 + 내장 메서드 활용
- 문자열의 앞뒤 공백 제거: trim()
- 공백 기준으로 단어 배열 생성: split(/\s+/) (연속 공백 처리)
- 단어 배열 뒤집기: reverse()
- 배열을 다시 문자열로 변환: 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에서는 내장 메서드를 적절히 조합하면, 문자열 단어 뒤집기를 효율적이고 간결하게 구현할 수 있다.