본문 바로가기

코드연습/BOJ

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

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)

'코드연습 > BOJ' 카테고리의 다른 글

BOJ 2004 : 조합 0의 개수  (0) 2022.05.09
BOJ 2981 : 검문  (0) 2022.04.28
BOJ 1037 : 약수  (0) 2022.04.27
BOJ 10814 : 나이순 정렬  (0) 2022.04.26
BOJ 1181 : 단어 정렬  (0) 2022.04.26