문제 개요
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', '! @' ]
코드 동작 원리
이 코드의 핵심 로직은 다음과 같이 정리할 수 있습니다.
- 결과 배열 초기화: 빈 문자열 세 개를 담은 배열
res를 준비합니다. 각각 알파벳, 숫자, 특수 문자를 저장하는 용도입니다. - 분류 기준 정의: 소문자 알파벳 목록과 숫자 목록을 문자열 상수로 선언합니다.
- 문자별 순회 및 분류: 문자열을 한 글자씩 확인하면서, 알파벳이면
res[0]에, 숫자면res[1]에 추가하고continue로 다음 문자로 넘어갑니다. 어느 조건에도 해당하지 않으면 자동으로 특수 문자이므로res[2]에 추가합니다. - 순서 보존: 문자열을 앞에서 뒤로 순차적으로 처리하기 때문에 각 분류 그룹 내에서 원래의 상대적 순서가 자연스럽게 유지됩니다.
알파벳 판별 시 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)하는 방식으로 동작하며, 마찬가지로 원래 문자열의 순서를 유지합니다. 코드가 짧아 가독성이 좋지만, 문자 길이가 매우 긴 경우에는 반복문 방식보다 여러 번의 정규표현식 연산으로 인해 성능이 다소 떨어질 수 있으므로 상황에 맞게 선택하면 됩니다.