최소공배수

GCD, LCM - 최대공약수와 최소공배수라는 간단해보이는 문제를 가져와 보았다. 얼핏 보면 초등학생도 풀 수 있는 간단한 문제지만 유클리드 알고리즘을 소개하기 위해 다루기로 했다.

유클리드 알고리즘을 접하기 전에는 두 수 중에서 작은 수를 찾고, 해당 수 부터 2 까지 for문을 돌리며 최대공약수를 찾았다. 이 방법도 맞지만, 주어지는 두 수가 커지면 연산량이 급격하게 증가한다는 단점이 있다. 이때, 유클리드 알고리즘(유클리드 호제법)을 활용하면 시간복잡도를 줄일 수 있다.

유클리드 호제법

정수 a,b에 대해서 a를 b로 나눈 나머지가 r이라고 할때, a와 b의 최대공약수를 (a,b)라고 하면

(a,b) = (b,r)

이 성립한다.증명

유클리드 알고리즘(유클리드 호제법) 예시를 보며 이해해보자. 78696과 19332에 대한 최대공약수를 찾는 과정이다.

78696 = 19332×4 + 1368
19332 = 1368×14 + 180
1368  = 180×7   + 108
180   = 108×1   + 72
108   = 72×1    + 36
72    = 36×2    + 0

이를 위의 표현으로 정리하면 (78696,19332) = (19332,1368) = (1368,180) = (180,108) = (108,72) = (72,36) = (36,0) 으로 최대공약수는 36이다.

이 방식을 스왑을 이용해 코드로 구현해보자.

  • x, y = y, x%y 를 통해 (a,b) = (b,r)를 구현한다.
  • 위의 과정을 y가 0이 될 때 까지 반복한다.
  • y가 0일 때의 x 값이 바로 최대공약수이다.
def GCD(x,y):
    while(y):
        x,y=y,x%y
    return x

최대공약수를 구했으니 이제 최소공배수에 대해 알아보자. C라는 최대공약수를 가지는 두 수 A,B가 있을 때, 최소공배수는 ACB임을 쉽게 알 수 있다. 따라서 두 수를 곱한 후 최대공약수를 나누어주면 최소공배수는 쉽게 구할 수 있다!


CODE

import sys

def GCD(x,y):
    while(y):
        x,y=y,x%y
    return x

for _ in range(int(input())):
    tmp = list(map(int,sys.stdin.readline().split()))
    tmp.sort()
    a=tmp[0]
    b=tmp[1]
    gcd=GCD(a,b)
    print(a*b//gcd)


[다시 풀어보기] ✔ - 2020.10.25