코드연습/BOJ

BOJ 2609 : 최대공약수와 최소공배수

AI 로밧 2022. 4. 27. 16:17
728x90

문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

풀이

앞의 약수에서 참고한 알고리즘인 '유클리드 호제법'을 조금만 참고하면 된다. 

두 수의 최대 공약수는 두 수의 나머지를 계속 나눔으로써, 언젠가 나누어 떨어지는 수를 의미한다. 그리고 최소 공배수는 두 수의 최대 공약수로 구성된 최소의 수 이므로 x(a를 최대공약수로 나눈 수)*y(b를 최대공약수로 나눈 수)*GCD(a,b)로 귀결된다. 이는 두 수(a = x* GCD(a,b), b = y*GCD(a,b))로 구성 되어 있기 때문에 각각의 최소 공배수는 위와 같이 구성된다.

최대공약수(GCD : Greatest Common Divisor)

최소공배수(LCM : Least Common Multiple)

import sys

if __name__ == '__main__':
    data = list(map(int, sys.stdin.readline().split()))
    
    a, b = max(data), min(data)
    while b > 0:
        a, b = b, a%b

    print(a)
    c, d = max(data), min(data)

    print(c * d // a)