양의 정수를 입력받아 해당 숫자의 모든 자릿수를 자릿값(place value) 형태로 담은 배열을 반환하는 함수, 예를 들어 splitNumber()를 작성해야 합니다.
예를 들어 다음과 같습니다.
입력 숫자가 아래와 같다면,
const num = 1234;
출력
출력 결과는 다음과 같아야 합니다.
const output = [1000, 200, 30, 4];
이제 이 함수의 코드를 직접 작성해 보겠습니다.
이 문제는 숫자의 각 자릿수를 하나씩 순회하며 처리하기 때문에 재귀(recursion) 접근 방식에 매우 적합합니다.
따라서 각 자릿수의 자릿값을 담은 배열을 반환하는 재귀 함수는 다음과 같이 작성할 수 있습니다.
예제
const splitNumber = (num, arr = [], m = 1) => {
if(num){
return splitNumber(Math.floor(num / 10), [m * (num % 10)].concat(arr), m * 10);
}
return arr;
};
console.log(splitNumber(2346));
console.log(splitNumber(5664));
console.log(splitNumber(3453));
console.log(splitNumber(2));
console.log(splitNumber(657576));
console.log(splitNumber(345232));
출력
콘솔 출력 결과는 다음과 같습니다.
[ 2000, 300, 40, 6 ] [ 5000, 600, 60, 4 ] [ 3000, 400, 50, 3 ] [ 2 ] [ 600000, 50000, 7000, 500, 70, 6 ] [ 300000, 40000, 5000, 200, 30, 2 ]
동작 원리
이 함수가 동작하는 과정을 단계별로 살펴보면 다음과 같습니다.
- num % 10 : 숫자의 마지막 자릿수를 추출합니다.
- m * (num % 10) : 추출한 자릿수에 현재 자릿값 배율(m)을 곱해 실제 자릿값을 계산합니다.
- Math.floor(num / 10) : 마지막 자릿수를 제거한 나머지 숫자를 구해 다음 재귀 호출에 전달합니다.
- m * 10 : 한 단계 높은 자릿수를 처리하기 위해 배율을 10배씩 증가시킵니다.
- num이 0이 되면 재귀 호출을 종료하고 지금까지 누적된 배열을 반환합니다.
이처럼 재귀 호출이 진행될수록 앞에서 구한 자릿값들이 배열 앞쪽에 붙여지기 때문에, 최종적으로 원래 숫자의 왼쪽 자릿수부터 오른쪽 자릿수 순서대로 정렬된 자릿값 배열을 얻을 수 있습니다.