✏️기록하는 즐거움
article thumbnail

| 최대공약수와 최소공배수

60과 48의 최대공약수는 좌측의 값들을 곱한 2 * 2 * 3 = 12 이고, 최소공배수는 12 * 5 * 4 = 240이다.

따라서, 최대공약수(Greatest Common Divisor, GCD) 최소공배수(Lowest Common Multiple, LCM)를 곱한 값은

주어진 두 수의 곱과 같다는 식이 성립된다.

 

| 최대공약수 구하기, 유클리드 호제법

유클리드 호제법이란 자연수의 최대공약수를 구하는 알고리즘의 하나이다.

호제법이란 두 수가 서로(互) 상대방 수를 나누어(除)서 원하는 수를 얻는 알고리즘을 나타낸다.

 

2개의 자연수 a, b에 대해서 a가 b보다 클 때 a를 b로 나눈 나머지를 r이라 하면, a와 b의 최대공약수는

b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수라는 것을 이용해 유클리드 호제법이 성립된다.

 

예시

위 그림과 같이 60과 48의 최대공약수를 유클리드 호제법으로 구해보자.

60과 48중 60이 더 크기 때문에 a = 60, b = 48로 하고 계산한다.
60 % 48 = 12 이므로 r = 12라 하고, 60과 48의 최대공약수 48과 12의 최대공약수와 같게 된다.

다시 48과 12를 나누면 나머지가 0이 되기 때문에 나누는 수인 12가 최대공약수가 된다.

60 % 48 = 12    // a = 60, b = 48
48 % 12 = 0     // a = 48, b = 12

// 12는 60과 48의 최대공약수

 

구현

이를 코드로 구현하게 되면 재귀함수나 반복문으로 작성할 수 있다.

// 재귀함수
function gcd(a, b) {
	 return b == 0 ? a : gcd(b, a % b);
}

// 반복문
function gcd(a, b) {
    while( b !== 0 ){
        let temp = a;
        a = b;
        b = temp % b;
    }
    return a;
}

 

위의 예시와 같이 b는 a로, a와 b를 나눈 나머지는 b로 들어가며 계산이 반복되고, 이는 a와 b를 나눈 나머지 즉, b 값이 0이 될 때까지 진행된다.

 

| 최소공배수

최소공배수는 최대공약수를 구했다면, 주어진 두 수의 곱 = 최대공약수 * 최소공배수 라는 식으로 쉽게 구할 수 있다.

최소공배수 = 두 수의 곱 / 최대공약수

 

구현

function lcm(a, b){
	 return (a * b) / gcd(a, b)
}

 

'Algorithm > Capsule' 카테고리의 다른 글

[JavaScript] 진수변환 - parseInt() vs. toString()  (0) 2023.01.05
profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!