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

JavaScript에서 배열을 활용해 문자열의 문자를 원하는 만큼 이동하기

문제 정의

영어 소문자 알파벳으로만 구성된 문자열이 하나 있다고 가정해 봅시다. 이 문제에서는 한 글자의 '단위 이동(unit shift)'을 해당 문자를 알파벳상 바로 다음 문자로 바꾸는 것으로 정의합니다. 단, 순환(circular) 처리가 포함되므로 'z' 다음에는 다시 'a'가 옵니다.

우리는 첫 번째 인수로 문자열 str을, 두 번째 인수로 str과 길이가 같은 숫자 배열 arr을 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 원본 문자열의 각 문자를 배열 arr에 담긴 해당 값만큼 이동시킨 새로운 문자열을 반환해야 합니다.

예를 들어,

입력 문자열과 배열이 다음과 같다면 −

const str = 'dab';
const arr = [1, 4, 6];

출력 결과는 다음과 같아야 합니다.

const output = 'eeh';

'd'는 1칸 이동해 'e'가 되고, 'a'는 4칸 이동해 'e', 'b'는 6칸 이동해 'h'가 됩니다.

구현 예제

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

const str = 'dab';
const arr = [1, 4, 6];
const shiftString = (str = '', arr = []) => {
    // 인덱스 계산을 쉽게 하기 위해 앞에 더미 문자를 붙인 기준표
    const legend = '-abcdefghijklmnopqrstuvwxyz';
    let res = '';
    for(let i = 0; i < arr.length; i++){
        const el = str[i];
        const shift = arr[i];
        const index = legend.indexOf(el);
        let newIndex = index + shift;
        // 26을 초과하면 나머지 연산으로 순환 처리
        newIndex = newIndex <= 26 ? newIndex : newIndex % 26;
        res += legend[newIndex];
    };
    return res;
};
console.log(shiftString(str, arr));

코드 설명

핵심 아이디어는 다음과 같습니다.

1. 기준표(legend) 활용: 문자열 '-abcdefghijklmnopqrstuvwxyz'를 만들어 맨 앞에 더미 문자 '-'를 추가함으로써, 'a'의 인덱스를 1로 맞춥니다. 이렇게 하면 알파벳 위치와 실제 이동 거리를 자연스럽게 대응시킬 수 있습니다.

2. 순환(circular) 처리: 이동 후 인덱스가 26(알파벳 개수)을 초과하면 모듈러 연산(% 26)을 적용해 'z' 다음에 'a'로 돌아오도록 처리합니다. 예를 들어 'x'를 5칸 이동하면 인덱스가 24 + 5 = 29가 되지만, 29 % 26 = 3이므로 'c'가 됩니다.

3. 결과 조립: 각 문자를 이동시킨 결과를 차례대로 이어 붙여 최종 문자열을 완성합니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

eeh

마무리

이 방식은 시간 복잡도 O(n)으로 문자열 길이에 비례해 선형적으로 동작하며, 배열의 값이 아무리 커도 모듈러 연산 덕분에 올바르게 순환 처리됩니다. 참고로 charCodeAt()String.fromCharCode()를 사용하면 별도의 기준표 없이도 문자 코드 연산으로 같은 로직을 구현할 수 있습니다.