Algorithm

[알고리즘] 유클리드 호제법 / 최대공약수

wooodii 2022. 9. 26. 09:36

2개의 자연수 or 최대공약수를 구하는 알고리즘 중 하나 

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

 

최대공약수를 구하는 일반적 방법 

소인수분해를 통해 두 수의 최대공약수를 구하기 위해서 사용 -> 두 수를 소인수분해 한 후, 공통 소수를 찾음

그러나, 숫자가 커질수록 소인수분해 하기 어려움 

 

MOD연산 

두 값을 나눈 나머지를 구하는 연산 

유클리드 호제법은 MOD연산의 반복

나머지가 0이 되었을 때, 마지막 계산에서 나누는 수로 사용된 139가 1112와 695의 최대공약수

1112 mod 695 = 417 

695 mod 417 = 278

417 mod 278 =139

278 mod 139 = 0 

 

 * 두 수에 대한 유클리드 호제법 

1) 두 수 중에서 큰 수를 작은 수로 나눔 

2) 만약 나누고 난 나머지가 0이라면 작은 수가 최대공약수임 

3) 만약 나머지가 0이 아니라면, 작은 수를 다시 나머지로 나눔 

4) 3)을 반복해 나머지가 0이 될 때의 수가 두 수의 최대공약수

 

* 호제법 : 두 수가 서로 상대방 수를 나누어서 원하는 수를 얻는 알고리즘 

 

* 자바스크립트로 유클리드 호제법 표현

function gcd(a,b) {
	const remainder = a % b; 
    if (remainder === 0 ) return b;
    return gcd(b, remainder);
    }
    // 두 수중에서 큰 수를 작은수로 나눌 때, 위의 코드에서는 해당 과정이 빠져 있음 
    // a가 작은수이고 b가 큰수일 때 remainder 값은 a가 됨 
    // return 시, 둘의 위치가 바꾸니 채로 함수가 재귀적으로 돌아가기 때문에 
    // 큰수 /작은수 구분이 필요 없음

 

관련 문제 

호제법 개념을 이해했다면, 관련된 문제를 한 번 풀어봐도 좋을 것 같다. 

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

작성한 풀이 

function solution(n, m) {
    var answer = [];
    const great = (a, b) => {  
        if (b === 0) return a   
        return great(b, a % b)  
    }
    const least = (a,b) => (a*b) / great(a,b)
    return [great(n,m), least(n,m)]
}
728x90