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

JavaScript에서 문자열의 자음만 뒤집는 방법


문제

소문자 영어 알파벳으로 이루어진 문자열 하나를 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 문자열 내 자음들의 순서만 거꾸로 뒤집고, 모음은 원래의 상대적 위치에 그대로 유지한 새로운 문자열을 만들어 반환해야 합니다.

예를 들어, 함수에 다음과 같은 문자열이 입력된다고 가정해 보겠습니다.

const str = 'somestring';

이때 기대되는 출력 결과는 다음과 같습니다.

const output = 'gonertsims';

접근 방법: 투 포인터(Two Pointer) 기법

이 문제는 투 포인터 기법으로 효율적으로 해결할 수 있습니다. 문자열의 양 끝에 포인터를 두고, 각 포인터가 자음을 가리킬 때까지 이동시킨 뒤 두 자음의 위치를 서로 교환합니다. 포인터가 모음을 만나면 그대로 건너뛰기 때문에 모음은 자연스럽게 원래 자리에 유지됩니다.

예제 코드

const str = 'somestring';

const reverseConsonants = (str = '') => {
    const arr = str.split('');
    let i = 0, j = arr.length - 1;
    const consonants = 'bcdfghjklmnpqrstvwxyz';
    while(i < j){
        while(i < j && consonants.indexOf(arr[i]) < 0) {
            i++;
        }
        while(i < j && consonants.indexOf(arr[j]) < 0) {
            j--;
        }
        let tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
        i++;
        j--;
    }
    return arr.join('');
};
console.log(reverseConsonants(str));

출력 결과

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

gonertsims

코드 동작 원리

  • 문자열을 배열로 변환: split('')을 사용해 문자열을 개별 문자 배열로 만들어 위치 교환이 가능하도록 준비합니다.
  • 양쪽에서 포인터 출발: 포인터 i는 배열의 앞에서, j는 뒤에서 시작합니다.
  • 자음 찾기: 왼쪽 포인터와 오른쪽 포인터가 각각 자음을 가리킬 때까지 이동합니다. 이 과정에서 모음은 건너뛰어지므로 원래 위치가 유지됩니다.
  • 자음 교환: 두 포인터가 모두 자음을 가리키면 두 문자의 위치를 맞바꾸고, 포인터를 각각 안쪽으로 한 칸씩 이동시킵니다.
  • 종료 조건: 두 포인터가 서로 교차하면(i < j가 더 이상 참이 아니면) 반복을 종료하고, join('')으로 배열을 다시 문자열로 합쳐 반환합니다.

이 알고리즘은 각 문자를 최대 한 번씩만 확인하므로 시간 복잡도는 O(n)입니다. 또한 배열 내에서 제자리(in-place)로 교환을 수행하기 때문에 문자열을 배열로 변환하는 공간 외에 추가 메모리가 거의 필요하지 않아 매우 효율적입니다.