Home [Python] 백준 2609번 : 최대공약수와 최소공배수
Post
Cancel

[Python] 백준 2609번 : 최대공약수와 최소공배수

Problem

https://www.acmicpc.net/problem/2609

Solution

code1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 최대공약수
def gcd(a,b):
    for i in range(min(a,b), 0, -1):
        if a % i == 0 and b % i == 0:
            return i

# 최소공배수
def lcm(a,b):
    for i in range(max(a,b), a*b+1):
        if i % a == 0 and i % b == 0:
            return i


a, b = map(int, input().split())
print(gcd(a, b))
print(lcm(a, b))

위 코드도 정답이 되긴 하지만 계산과정이 조금 비효율적이다. 아래의 방법은 유클리드 호제법과 최소공배수의 성질을 활용하여 시간을 단축하였다.

code2 (유클리드 호제법)

1
2
3
4
5
6
7
8
9
10
11
12
# 최대공약수
def gcd(a, b):
    while b:
        r = a%b
        (a, b) = (b, r)
    return abs(a)

a, b = map(int, input().split())
x = gcd(a, b)
y = int(a*b/x) # 최소공배수
print(x)
print(y)

Memo

위의 코드에서 최대공약수를 구하는 부분은 유클리드 호제법을 활용한 방법으로 나머지가 0이 될 때의 값을 찾는 것이다.
최소공배수는 최대공약수를 이용해서 구했는데 최소공배수 = 두수의 곱/최대공약수인 수의 성질을 활용한 것이다.

Ref.

유클리드 호제법
최대공약수와 최소공배수의 관계

This post is licensed under CC BY 4.0 by the author.

[Python] 백준 2775번 : 부녀회장이 될테야

[Python] 백준 2751번 : 수 정렬하기 2