문제 개요
공백을 포함할 수 있는 문자열이 주어졌을 때, 공백의 위치는 그대로 유지하면서 나머지 문자들만 거꾸로 뒤집는 JavaScript 함수를 작성해야 합니다.
여기서 핵심은 문자열 전체를 단순히 뒤집는 것이 아니라, 각 공백이 원래 있던 인덱스 자리에 그대로 머물도록 하면서 문자들의 순서만 반전시키는 것입니다.
접근 방식
이 문제는 다음과 같은 아이디어로 해결할 수 있습니다.
- 문자열의 끝에서부터 앞으로 순회하면서, 공백이 아닌 문자를 결과 문자열에 차례대로 이어 붙입니다.
- 결과 문자열의 현재 길이(res.length)가 가리키는 원본 문자열의 위치가 공백이라면, 해당 공백을 결과 문자열에 그대로 삽입합니다.
- 이 과정을 끝까지 반복하면 공백은 원래 위치에 고정된 채, 나머지 문자들만 역순으로 배치됩니다.
예제 코드
다음은 위 로직을 구현한 코드입니다.
const str = 'this is normal string';
const reverseWordsWithin = (str = '') => {
let res = "";
for (let i = str.length - 1; i >= 0; i--){
if(str[i] != " "){
res += str[i];
};
if(str[res.length] == " "){
res += str[res.length];
};
};
return res;
};
console.log(reverseWordsWithin(str));실행 결과
gnir ts lamron sisiht
코드 동작 원리 살펴보기
원본 문자열 'this is normal string'에서 공백은 인덱스 4, 7, 14에 위치합니다. 위 코드는 문자열 끝에서부터 문자를 하나씩 가져와 붙이되, 결과 문자열의 길이가 공백 위치에 도달할 때마다 공백을 먼저 삽입하는 방식으로 동작합니다.
참고로 문자열 전체를 단순히 뒤집으면 'gnirts lamron si siht'가 되지만, 공백을 원래 자리(인덱스 4, 7, 14)에 고정하면 위 실행 결과처럼 'gnir ts lamron sisiht'가 됩니다. 즉, 공백 자리를 기준으로 문자들만 정확히 뒤집힌 것을 확인할 수 있습니다.
이 알고리즘은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 입력 문자열의 길이가 커져도 효율적으로 동작합니다.