MapleStory Finger Point

백준 알고리즘

백준 알고리즘 2609번 최대공약수와 최소공배수 (파이썬)

吳鍾振 2022. 8. 19. 20:07

문제:

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

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.


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

a, b = map(int, input().split())

# 유클리드 호제법 (최대공약수 구하기)
def gcd(m,n):
    # 기본 전제로 m이 n보다 더 큰 수이어야 한다
    if m < n:   # n이 더 크면 자리를 바꿔준
        m, n = n, m
    if n == 0:  # 만약 두 수 중에 하나가 0이면 다른 수가 최대공약수가 된다
        return m
    if m % n == 0:  # 만약 두 수가 나누어 떨어지면 n이 최대공약수!
        return n
    else:
        # 이 구문이 유클리드 호제법의 핵심이 된다
        # 위의 세가지 조건에도 해당하지 않을 경우,
        # m은 n로 나누어 떨어지지 않기 때문에, m을 n으로 나눈 나머지를 구한다. ≫ m % n
        # n은 (m % n)으로 나누어 떨어지지 않기 때문에, n을 (m % n)으로 나눈 나머지를 구한다. ≫ n % (m % n)
        # (m % n)는 (n % (m % n))으로 나누어 떨어질 때까지 반복한다.
        return gcd(n, m%n)

print(gcd(a, b))
# 최소공배수는 두 수를 곱한 값에 최대공약수를 나누어주면 끝이다.
print(int(a * b / gcd(a, b)))

결과:

 

반응형