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

자바스크립트로 배열의 모든 숫자를 나눌 수 있는 공통 약수 구하기

문제 소개

숫자로 이루어진 배열을 입력받아, 배열 안의 모든 숫자를 나머지 없이 정확히 나눌 수 있는 숫자(공통 약수)를 찾아 반환하는 자바스크립트 함수를 작성해야 합니다.

예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.

const arr = [4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42];

위 배열의 모든 요소는 짝수이므로, 이 배열 전체를 나눌 수 있는 숫자는 최소한 2입니다. 실제로 코드를 실행하면 어떤 값들이 공통 약수인지 확인할 수 있습니다.

해결 접근 방식

이 문제는 크게 두 단계로 나누어 해결할 수 있습니다.

1단계: 배열의 각 숫자에 대해, 해당 숫자를 나눌 수 있는 모든 약수의 목록을 구합니다. 이때 자기 자신을 제외하고, 1도 제외하기 위해 el / 2부터 2까지 역순으로 검사합니다.

2단계: 각 숫자별로 만들어진 약수 목록들을 비교하여, 모든 목록에 공통으로 존재하는 값만 남깁니다. 이것이 바로 배열 전체를 나눌 수 있는 숫자입니다.

코드 구현

위 접근 방식을 코드로 구현하면 다음과 같습니다.

const arr = [4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42];
const dividesAll = el => {
   const result = [];
   let num;
   for (num = Math.floor(el / 2); num > 1; num--){
      if (el % num === 0) {
         result.push(num);
      }
   };
   return result;
};
const dividesArray = arr => {
   return arr.map(dividesAll).reduce((acc, val) => {
      return acc.filter(el => val.includes(el));
   });
};
console.log(dividesArray(arr));

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

[ 2 ]

코드 설명

  • dividesAll 함수: 인자로 받은 숫자(el)의 절반 값부터 2까지 내림차순으로 반복하면서, 나머지 연산(%) 결과가 0이 되는 숫자, 즉 약수를 result 배열에 차례대로 저장합니다.
  • dividesArray 함수: map()을 사용해 배열의 모든 요소를 각각의 약수 배열로 변환한 뒤, reduce()filter()를 조합하여 여러 약수 배열 사이의 교집합을 구합니다.

최종 결과가 [ 2 ]인 이유는, 주어진 배열의 모든 숫자가 짝수이기 때문에 2가 유일하게 배열 전체를 나눌 수 있는 공통 약수이기 때문입니다. 만약 배열에 홀수나 서로소 관계의 숫자가 섞여 있다면, 공통 약수가 존재하지 않아 빈 배열이 반환될 수 있습니다.