이번 글에서는 문자열 str을 첫 번째 인수로, 정수 num을 두 번째 인수로 받아 특정 규칙에 따라 문자열을 반전하는 JavaScript 함수를 작성해 보겠습니다.
동작 규칙 정리
함수는 문자열 시작부터 2 * num개의 문자를 하나의 블록으로 보고, 각 블록에서 앞의 num개 문자만 반전한 뒤 나머지는 원래 순서 그대로 둡니다. 세부 규칙은 다음과 같습니다.
- 남은 문자가
num개보다 적다면 → 남은 문자 전체를 반전합니다. - 남은 문자가
num개 이상이면서2 * num개 미만이라면 → 앞의num개만 반전하고 나머지는 그대로 유지합니다. - 그 외의 경우 →
2 * num개씩 순회하며 매 블록의 첫num개 문자를 반전합니다.
입출력 예시
const str = 'klmnopq'; const num = 2;
이때 기대하는 출력은 다음과 같습니다.
const output = 'lkmnpoq';
과정을 살펴보면, 먼저 앞의 4개 문자('klmn') 중 처음 2개('kl')를 반전해 'lk'로 만들고, 다음 블록으로 넘어가면 3개 문자('opq')만 남습니다. 따라서 그중 처음 2개('op')를 반전해 'po'로 만들고 마지막 'q'는 그대로 둡니다. 최종 결과는 'lkmnpoq'가 됩니다.
구현 코드
const str = 'klmnopq';
const num = 2;
const reverseString = (str = '', num = 1) => {
// 남은 문자가 num보다 적으면 전체를 반전
if(str.length < num){
return str.split('').reverse().join('');
};
let res = '';
// 2 * num 크기의 블록 단위로 순회
for(let i = 0; i < str.length; i += (2*num)){
// 현재 블록의 첫 num개 문자를 반전하여 추가
res += str.split('').slice(i, i+num).reverse().join('');
// 나머지 부분은 원래 순서 그대로 추가
res += str.slice(i+num, i+2*num);
};
return res;
};
console.log(reverseString(str, num));
코드 동작 방식
- 예외 처리: 문자열 길이가
num보다 작으면 규칙에 따라 전체를 반전해 즉시 반환합니다. - 블록 순회: 인덱스
i를2 * num씩 증가시키며 각 블록의 시작 위치로 이동합니다. - 반전 처리:
slice(i, i + num)으로 추출한 첫num개 문자를 반전한 뒤 결과 문자열에 이어 붙입니다. - 원본 유지:
slice(i + num, i + 2 * num)으로 나머지 문자를 그대로 덧붙입니다. - 마지막 블록에서 남은 문자가
num개 미만이더라도slice가 자동으로 남은 범위만 처리하므로, 별도의 분기 없이도 규칙이 자연스럽게 적용됩니다.
성능 개선 팁
위 코드는 반복문 안에서 매번 split('')을 호출하므로 문자열이 길어질수록 비효율적입니다. 반복문 시작 전에 문자열을 한 번만 배열로 변환해 두면 불필요한 연산을 줄여 전체 시간 복잡도를 O(n) 수준으로 개선할 수 있습니다.
실행 결과
콘솔에는 다음과 같이 출력됩니다.
lkmnpoq