문제 개요
문자열 안에 여러 개의 숫자가 섞여 있을 때, 이 숫자들을 모두 추출하여 하나의 숫자로 만들어주는 자바스크립트 함수를 작성해 보겠습니다.
예를 들어 'sfsd8fsdf6dsfsd8sdfs28fd0' 같은 문자열이 입력되면, 함수는 문자열에 포함된 모든 숫자를 순서대로 이어 붙여 86828이라는 결과를 반환해야 합니다.
참고: 만약 문자열에 숫자가 전혀 포함되어 있지 않다면 함수는 0을 반환해야 합니다.
예제 코드
const str = 'sfsd8fsdf6dsfsd8sdfs28fd0';
const pickNumbers = (str = '') => {
let res = 0;
for(let i = 0; i < str.length; i++){
const el = str[i];
if(+el){
res = (res * 10) + +el;
};
};
return res;
};
console.log(pickNumbers(str));
console.log(pickNumbers('this string contains no numbers'));
코드 동작 원리
이 코드의 핵심 로직은 다음과 같습니다.
- 단항 연산자(+): 각 문자를 숫자로 변환합니다. 숫자가 아닌 문자는 NaN이 되어 if 조건에서 거짓으로 평가되므로 자연스럽게 걸러집니다.
- res * 10 + +el: 기존 결과값에 10을 곱해 자릿수를 한 칸 밀어낸 뒤 새로운 숫자를 더하는 방식으로, 발견된 숫자를 차례대로 이어 붙입니다.
- 기본값 처리: 결과 변수의 초기값이 0이므로, 숫자가 하나도 발견되지 않으면 그대로 0이 반환됩니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
86828
0
정규식을 활용한 더 간결한 방법
같은 작업은 정규식을 사용하면 훨씬 짧은 코드로 처리할 수 있습니다.
const pickNumbers = (str = '') => {
const matched = str.match(/\d/g);
return matched ? +matched.join('') : 0;
};이 방식은 문자열에서 모든 숫자 문자를 배열로 추출한 뒤 이어 붙여 숫자로 변환하고, 매칭 결과가 없으면 0을 반환합니다. 다만 추출되는 숫자가 매우 길면 Number 타입의 안전한 정수 범위를 초과할 수 있으므로, 필요에 따라 문자열 형태로 유지하거나 BigInt를 사용하는 것도 고려해 보세요.