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

자바스크립트(JavaScript)로 문자열을 원형으로 왼쪽·오른쪽 이동시키는 방법


자바스크립트에서는 문자열 하나와 두 개의 숫자를 인수로 받아, 지정된 횟수만큼 문자열을 원형(circular)으로 회전시키는 함수를 작성할 수 있습니다. 첫 번째 인수는 대상 문자열(str), 두 번째와 세 번째 인수는 각각 왼쪽 시프트 횟수(m)와 오른쪽 시프트 횟수(n)를 의미합니다.

왼쪽 시프트(Left Shift)란?

왼쪽 시프트는 문자열을 한 칸 원형으로 회전하는 연산으로, 첫 번째 문자가 맨 뒤로 이동하고 나머지 모든 문자는 한 인덱스씩 왼쪽으로 밀리는 것을 말합니다.

예를 들어 abcde는 왼쪽 시프트를 한 번 수행하면 bcdea가 되고, 두 번 수행하면 cdeab가 됩니다.

오른쪽 시프트(Right Shift)란?

오른쪽 시프트는 그 반대로, 마지막 문자가 맨 앞으로 이동하고 나머지 문자들이 한 칸씩 오른쪽으로 밀리는 연산입니다.

예를 들어 abcde는 오른쪽 시프트를 한 번 수행하면 eabcd가 되고, 두 번 수행하면 deabc가 됩니다.

정리하면, 작성할 함수는 지정된 횟수만큼 왼쪽 시프트와 오른쪽 시프트를 차례대로 적용한 뒤, 최종 결과 문자열을 반환해야 합니다.

구현 예제

이를 구현한 코드는 다음과 같습니다.

const str = 'abcdef';
const getShiftedString = (str, leftShifts, rightShifts) =>
  shiftByAmount(shiftByAmount(str, leftShifts), -rightShifts);

// 헬퍼 함수
// 양수는 왼쪽으로, 음수는 오른쪽으로 이동
const shiftByAmount = (str, leftShifts) => {
  leftShifts = leftShifts % str.length;
  return str.slice(leftShifts) + str.slice(0, leftShifts);
};
console.log(getShiftedString(str, 3, 2));

출력 결과

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

bcdefa

코드 동작 원리

이 코드의 핵심은 slice() 메서드와 나머지 연산자(%)입니다.

  • 나머지 연산(%): 시프트 횟수가 문자열 길이보다 클 경우를 대비해 leftShifts % str.length로 값을 정규화합니다. 예를 들어 길이 6인 문자열을 8번 왼쪽으로 이동하는 것은 2번 이동하는 것과 결과가 같습니다.
  • 음수 인덱스 활용: 오른쪽 시프트 n번은 왼쪽 시프트 -n번과 수학적으로 동일합니다. slice(-n)은 뒤에서 n개 문자를 잘라내므로, 이를 앞부분과 이어 붙이면 오른쪽 시프트가 자연스럽게 구현됩니다.
  • 함수 재사용: getShiftedString은 왼쪽 시프트를 먼저 적용한 뒤, 오른쪽 시프트를 음수 값으로 변환해 같은 헬퍼 함수를 재사용함으로써 코드를 간결하게 유지합니다.

예제에서 'abcdef'를 왼쪽으로 3번 이동하면 'defabc'가 되고, 여기서 오른쪽으로 2번 더 이동하면 최종적으로 'bcdefa'가 출력됩니다.