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

JavaScript로 문자열 문자 재그룹화하기 — 알파벳·숫자·특수문자 분리 방법

문제 개요

JavaScript에서 문자열을 입력받아 포함된 문자들을 성격별로 분류하는 함수를 작성해야 합니다. 함수는 문자열 str을 첫 번째이자 유일한 인수로 받습니다.

입력 문자열에는 다음 세 가지 유형의 문자가 포함될 수 있습니다.

  • 영문 알파벳: 대문자(A-Z)와 소문자(a-z)
  • 숫자: 0부터 9까지
  • 특수 문자: 위 두 범주에 속하지 않는 나머지 모든 문자

함수는 문자열을 순회하면서 정확히 세 개의 요소를 가진 배열을 생성해야 합니다. 첫 번째 요소에는 문자열에 포함된 모든 알파벳을, 두 번째 요소에는 모든 숫자를, 세 번째 요소에는 모든 특수 문자를 담습니다. 이때 각 문자의 원래 상대적 순서는 그대로 유지해야 하며, 최종적으로 이 배열을 반환하면 됩니다.

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

입력

const str = 'thi!1s is S@me23';

출력

const output = [ 'thisisSme', '123', '! @' ];

구현 예제

다음은 이 문제를 해결하는 전체 코드입니다.

const str = 'thi!1s is S@me23';

const regroupString = (str = '') => {
  const res = ['', '', ''];
  const alpha = 'abcdefghijklmnopqrstuvwxyz';
  const numerals = '0123456789';

  for(let i = 0; i < str.length; i++){
    const el = str[i];
    if(alpha.includes(el) || alpha.includes(el.toLowerCase())){
      res[0] += el;
      continue;
    }
    if(numerals.includes(el)){
      res[1] += el;
      continue;
    }
    res[2] += el;
  }
  return res;
};

console.log(regroupString(str));

출력 결과

[ 'thisisSme', '123', '! @' ]

코드 동작 원리

이 코드의 핵심 로직은 다음과 같이 정리할 수 있습니다.

  1. 결과 배열 초기화: 빈 문자열 세 개를 담은 배열 res를 준비합니다. 각각 알파벳, 숫자, 특수 문자를 저장하는 용도입니다.
  2. 분류 기준 정의: 소문자 알파벳 목록과 숫자 목록을 문자열 상수로 선언합니다.
  3. 문자별 순회 및 분류: 문자열을 한 글자씩 확인하면서, 알파벳이면 res[0]에, 숫자면 res[1]에 추가하고 continue로 다음 문자로 넘어갑니다. 어느 조건에도 해당하지 않으면 자동으로 특수 문자이므로 res[2]에 추가합니다.
  4. 순서 보존: 문자열을 앞에서 뒤로 순차적으로 처리하기 때문에 각 분류 그룹 내에서 원래의 상대적 순서가 자연스럽게 유지됩니다.

알파벳 판별 시 el.toLowerCase()를 함께 확인하므로 대문자와 소문자를 모두 올바르게 처리할 수 있다는 점도 주목할 만합니다.

정규표현식을 활용한 간결한 대안

같은 결과를 정규표현식으로도 훨씬 간결하게 얻을 수 있습니다.

const regroupString = (str = '') => {
  return [
    str.replace(/[^a-zA-Z]/g, ''),  // 알파벳만 남기기
    str.replace(/[^0-9]/g, ''),     // 숫자만 남기기
    str.replace(/[a-zA-Z0-9]/g, '') // 특수 문자만 남기기
  ];
};

이 방식은 불필요한 문자를 제거(replace)하는 방식으로 동작하며, 마찬가지로 원래 문자열의 순서를 유지합니다. 코드가 짧아 가독성이 좋지만, 문자 길이가 매우 긴 경우에는 반복문 방식보다 여러 번의 정규표현식 연산으로 인해 성능이 다소 떨어질 수 있으므로 상황에 맞게 선택하면 됩니다.