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

JavaScript 문자열 반전: 2k 문자마다 앞 k개만 뒤집는 함수 구현하기

이번 글에서는 문자열 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));

코드 동작 방식

  1. 예외 처리: 문자열 길이가 num보다 작으면 규칙에 따라 전체를 반전해 즉시 반환합니다.
  2. 블록 순회: 인덱스 i2 * num씩 증가시키며 각 블록의 시작 위치로 이동합니다.
  3. 반전 처리: slice(i, i + num)으로 추출한 첫 num개 문자를 반전한 뒤 결과 문자열에 이어 붙입니다.
  4. 원본 유지: slice(i + num, i + 2 * num)으로 나머지 문자를 그대로 덧붙입니다.
  5. 마지막 블록에서 남은 문자가 num개 미만이더라도 slice가 자동으로 남은 범위만 처리하므로, 별도의 분기 없이도 규칙이 자연스럽게 적용됩니다.

성능 개선 팁

위 코드는 반복문 안에서 매번 split('')을 호출하므로 문자열이 길어질수록 비효율적입니다. 반복문 시작 전에 문자열을 한 번만 배열로 변환해 두면 불필요한 연산을 줄여 전체 시간 복잡도를 O(n) 수준으로 개선할 수 있습니다.

실행 결과

콘솔에는 다음과 같이 출력됩니다.

lkmnpoq