이번 글에서는 임의 개수의 숫자 인자를 받아 모두 더한 뒤, 그 결과가 한 자리 숫자가 될 때까지 각 자릿수를 계속 곱하는 JavaScript 함수를 만들어 보겠습니다.
문제 이해하기
예를 들어 인자가 다음과 같이 주어졌다고 가정해 보겠습니다.
16, 34, 42
먼저 세 숫자를 모두 더합니다.
16 + 34 + 42 = 92
그다음 결과값이 한 자리 숫자가 될 때까지 자릿수끼리 곱을 반복합니다.
9 * 2 = 18
1 * 8 = 8
최종적으로 한 자리 숫자인 8에 도달하면, 함수는 이 값을 반환하면 됩니다.
풀이 접근 방식
이 문제는 두 개의 함수로 나누어 해결할 수 있습니다.
product() 함수: 하나의 숫자를 받아 각 자릿수의 곱을 재귀적으로 계산하여 반환합니다.
재귀 호출부: product() 함수를 반복적으로 호출하면서 결과가 한 자리 숫자가 되었는지 확인하고, 한 자리가 되면 그 값을 반환하고 그렇지 않으면 계속 반복합니다.
구현 코드
전체 기능을 구현한 코드는 다음과 같습니다.
예제
const recursiveMuliSum = (...numbers) => {
const add = (a) => a.length === 1 ? a[0] : a.reduce((acc, val) => acc+val);
const produce = (n, p = 1) => {
if(n){
return produce(Math.floor(n/10), p*(n%10));
};
return p;
};
const res = produce(add(numbers));
if(res > 9){
return recursiveMuliSum(res);
}
return res;
};
console.log(recursiveMuliSum(16, 28));
console.log(recursiveMuliSum(16, 28, 44, 76, 11));
console.log(recursiveMuliSum(1, 2, 4, 6, 8));코드 설명
add 함수는 전달받은 배열의 요소가 하나뿐이라면 그 값을 그대로 반환하고, 여러 개라면 reduce() 메서드로 모든 값을 더합니다. produce 함수는 재귀를 활용해 숫자의 마지막 자릿수(n % 10)를 누적 곱(p)에 곱해 나가고, n이 0이 되면 최종 곱을 반환합니다. 마지막으로 결과가 9보다 크면 recursiveMuliSum을 다시 호출해 과정을 반복하고, 한 자리 숫자가 나오면 그대로 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
6
5
2