내 맘대로 공부
article thumbnail

📌 최대공약수 (GCD)

두 수(num1, num2)의 약수 중 공통의 가장 큰 정수 ex) ( 3, 12 ) = 3

JS로 최대공약수를 가장 쉽게 구하는 법은 2부터 증가하면서 두 수 중 가장 작은 수 까지 반복하는 것이다. 

 

function getGcd(num1, num2) {
  let gcd = 1;
  for (let i = 2; i <= Math.min(num1, num2); i++) {
    if (num1 % i === 0 && num2 % i === 0) {
      gcd = i;
    }
  }
  return gcd;
}

 


📌 최소공배수 (LCM)

두 수(num1, num2)의 공통 배수 중 가장 작은 정수 ex) ( 3, 12 ) = 12

하나의 변수를 1부터 점차 증가하면서 변수에 두 수를 나누었을 때 나머지가 0이 되는 수를 찾으면 된다  

 

function getLcm(num1, num2) {
  let lcm = 1;

  while (true) {
    if (lcm % num1 === 0 && lcm % num2 === 0) {
      break;
    }
    lcm++;
  }

  return lcm;
}

📌 유클리드 호제법

num1를 num2로 나눈 나머지를 r이라고 했을 때, GCD(num1, num2) = GCD(num2, r)과 같다는 것을 기반으로 한다.

 

ex01) num1 = 24, num2 = 16 -> GCD(24, 16) = GCD(16, 8) = GCD(8, 0) = 8

ex02) num1 = 30, num2 = 4 -> GCD(30,4) = GCD(4, 2) = GCD(2, 0) = 2 

ex03) num1 = 54, num2 = 9 -> GCD(54,9) = GCD(9, 0) = 9

 

이때, num2가 0이 될 때까지 반복하다 보면 결국 num1의 값이 두 수의 최대공약수인 것을 알 수 있다. 

이러한 규칙을 이용하여 유클리드 호제법을 이용한 최대공약수 구하는 방법은 아래와 같다. 

 

function getGcd(num1, num2) {
  return num2 > 0 ? getGcd(num2, num1 % num2) : num1;
}

 

그리고, 유클리드 호제법 이론으로 최소 공배수를 구하는 방법은 num1 * num2 = lcm * gcd 공식을 이용하면 된다. 

우리는 lcm 을 구해야 하니 위의 수식을 이용한 결과로는 lcm = (num1 * num2) / gcd 를 구할 수 있다. 

 

그렇기에 총 정리를 해보자면, 아래와 같은 코드가 나온다. 

function getGcdLcm(num1, num2) {
  const getGcd = (a, b) => (b > 0 ? getGcd(b, a % b) : a);
  const getLcm = (a, b) => (a * b) / getGcd(a, b);

  return [getGcd(num1, num2), getLcm(num1, num2)];
}

 

profile

내 맘대로 공부

@곰도리도리잼

잘못된 정보가 있다면 알려주세요 🧸