문제 정의
숫자 배열을 유일한 인자로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 배열 요소 중 자릿수가 짝수인 숫자들을 모두 골라 새로운 배열로 반환해야 합니다.
예를 들어 입력 배열이 다음과 같다면 −
const arr = [34, 23, 112, 8, 3456, 345];
출력 결과는 다음과 같아야 합니다 −
const output = [34, 23, 3456];
34와 23은 2자리, 3456은 4자리이므로 자릿수가 짝수입니다. 반면 112와 345는 3자리, 8은 1자리이므로 결과에서 제외됩니다.
예제 코드
const arr = [34, 23, 112, 8, 3456, 345];
const countDigits = (num, sum = 0) => {
if(num){
return countDigits(Math.floor(num / 10), sum + 1);
};
return sum;
};
const isEven = num => num % 2 === 0;
const returnEvens = (arr = []) => {
const res = arr.filter(el => isEven(countDigits(el)));
return res;
};
console.log(returnEvens(arr));
코드 설명
countDigits: 재귀 호출을 통해 숫자를 10으로 나눈 몫을 계속 전달하면서 호출 횟수, 즉 자릿수를 셉니다. 기본 매개변수 sum이 카운터 역할을 하며, 숫자가 0이 되면 누적된 값을 반환합니다.
isEven: 모듈로 연산자(%)를 사용해 숫자가 2로 나누어떨어지는지, 즉 짝수인지 판별합니다.
returnEvens: Array.prototype.filter() 메서드로 각 요소의 자릿수가 짝수인 경우만 걸러내어 새로운 배열을 생성합니다.
더 간단한 대안: 문자열 변환 활용
재귀 대신 숫자를 문자열로 변환하면 자릿수를 훨씬 간결하게 구할 수 있습니다.
const returnEvens = (arr = []) =>
arr.filter(num => String(Math.abs(num)).length % 2 === 0);
console.log(returnEvens([34, 23, 112, 8, 3456, 345])); // [34, 23, 3456]
Math.abs()로 절댓값을 구하면 음수도 부호를 제외한 실제 자릿수 기준으로 올바르게 처리됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[34, 23, 3456]