Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 짝수·홀수 자릿수 합이 각각 나누어 떨어지는 N자리 숫자 개수 구하기

이번 글에서는 세 개의 숫자 A, B, N을 입력받아, N자리 숫자 중에서 짝수 번째 자릿수의 합이 A로 나누어 떨어지고, 홀수 번째 자릿수의 합이 B로 나누어 떨어지는 숫자들을 모두 찾아내는 JavaScript 함수를 작성해 보겠습니다.

문제 접근 방식

가장 먼저 주어진 숫자의 각 자릿수를 오른쪽부터 분리하면서, 위치 인덱스(0부터 시작)가 짝수인지 홀수인지에 따라 두 개의 합계 변수에 각각 누적하는 재귀 함수를 만듭니다. 그다음 N자리 숫자의 전체 범위(10^(N-1)부터 10^N - 1까지)를 순회하면서 각 숫자가 조건을 만족하는지 검사하고, 조건을 통과한 숫자만 결과 배열에 담아 반환합니다.

예제 코드

const indexSum = (num, sumOdd = 0, sumEven = 0, index = 0) => {
   if(num){
       if(index % 2 === 0){
           sumEven += num % 10;
       }else{
           sumOdd += num % 10;
       };
 
       return indexSum(Math.floor(num / 10), sumOdd, sumEven, ++index);
   };
   return {sumOdd, sumEven};
 
}; 
const divides = (b, a) => a % b === 0;
const countNum = (n, first, second) => {
   let start = Math.pow(10, (n-1));
   const end = Math.pow(10, n)-1;
   const res = [];
   while(start <= end){
       const { sumEven, sumOdd } = indexSum(start);
       const condition = divides(first, sumEven) && divides(second, sumOdd);
       if(condition){
           res.push(start);
       };
       start++;
   };
   return res;
};
console.log(countNum(2, 5, 3));

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ 30, 35, 60, 65, 90, 95 ]

코드 설명

  • indexSum 함수: 숫자를 재귀적으로 한 자릿수씩 분리하며, 현재 인덱스가 짝수면 해당 자릿수를 sumEven에, 홀수면 sumOdd에 더합니다. 최종적으로 두 합계를 객체로 반환합니다.
  • divides 함수: 첫 번째 인자 b가 두 번째 인자 a를 나누어 떨어지게 하는지(a % b === 0) 여부를 불리언 값으로 반환합니다.
  • countNum 함수: N자리 숫자의 시작 값(10^(N-1))과 끝 값(10^N - 1) 사이를 반복하며, 각 숫자의 짝수 자릿수 합이 first(A)로, 홀수 자릿수 합이 second(B)로 나누어 떨어지는 경우만 결과 배열에 추가합니다.

결과 검증

예를 들어 countNum(2, 5, 3)의 결과 중 하나인 35를 살펴보면, 일의 자리 5는 짝수 인덱스(0)에 해당하여 합이 5(A로 나누어 떨어짐), 십의 자리 3은 홀수 인덱스(1)에 해당하여 합이 3(B로 나누어 떨어짐)이므로 조건을 만족합니다. 같은 방식으로 30, 60, 65, 90, 95도 모두 조건을 충족함을 확인할 수 있습니다.