JS algorithms - GCD & LCM 과 유클리드 호제법

Jaa-van·2023년 4월 10일
0
post-thumbnail

문제

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.

내가 푼 방법

function solution(n, m) {
    var answer = [];
    for (let i=Math.min(n,m);i>=1;i--){
        if(n%i==0 && m%i==0) {
            answer.push(i)
            break
        }
    }
    for (let j=Math.max(n,m);j<=n*m;j++){
        if(j%n==0&&j%m==0) {
            answer.push(j) 
            break
        }
    }
    return answer;
}

다른 사람의 풀이

function gcdlcm(a, b) {
    var r;
    for(var ab= a*b;r = a % b;a = b, b = r){}
    return [b, ab/b];
}

b=> 최대공약수
ab/b => 최소공배수

아직 코드가 이해가지 않아서 for 문의 진행 과정을 풀어서 써보았다


6, 12

ab= 72
r=6 % 12 == 6
a=>6 b=>6
r= 6%6 == // for문 끝남

6, 72/6 12



15,27

ab = 405
r=15% 27 == 15
a=>27, b=>15

r=27%15 == 12
a=>15, b= 12

r= 15 % 12 == 3
a=>12, b=>3

r= 12%3 == 0

b, ab/b => 3, 405/3


최대공약수와 최소공배수의 특징을 먼저 살펴봐야 할 것 같다
아직 전혀 이해가 가지 않는다

=> 유클리드 호제법을 for 문으로 아름답게 옮겨놓은 것 같다
15, 27을 유클리드 호제법으로 구해보자
27 % 15 == 12

15 % 12 == 3

12 % 3 == 0 // 이 전의 나머지 였던 3이 최대공약수
최소 공배수는 두 자연수의 곱 / 최대공약수
따라서 ab/GCD == 405/3 == 135

for 문의 조건문 부분에 r= a%b 를 넣어 0 이 되면 falsy 에 해당되기 때문에 반복문이 끝난다
즉, a 와 b 가 나누어 떨어질 때 끝나게 되고 그 전 계산의 나머지인 b 가 최대공약수( GCD ) 가 된다
최소공배수는 두 수의 곱/GCD 이기 때문에 ab/b 가 된다

결론

for 문의 조건문과 증감식에 다양한 식을 넣어 사용할 수 있으며 유클리드 호제법을 통해 GCD, LCM 을 구하는 방법을 배웠다

0개의 댓글

관련 채용 정보