본문 바로가기
Python 알고리즘

최대공약수와 최소공배수

by Tripleler 2022. 6. 28.

약수

1과 자기 자신을 제외한 자연수로 나누었을 때 나머지가 0이 되는 수

ex)

12의 약수 : 2, 3, 4, 6

9의 약수 : 3

 

공약수

공통되는 약수

ex)

6과 8의 공약수 : 2

10과 20의 공약수 : 2, 5, 10

18, 24, 36의 공약수 : 2, 3, 6

 

최대공약수 (Greatest Common Divisor)

공약수 중에서 가장 큰 수

ex)

6과 8의 최대공약수 : 2

10과 20의 최대공약수 : 10

18, 24, 36의 최대공약수 : 6

 

배수

자기 자신에 자연수를 곱해서 나오는 수

ex)

2의 배수 : 2, 4, 6, \(\cdots\)

12의 배수 : 12, 24, 36, \(\cdots\)

 

공배수

공통되는 배수

6과 8의 공배수 : 24, 48, 72, \(\cdots\)

10과 20의 공배수 : 20, 40, 60, \(\cdots\)

18, 24, 36의 공배수 : 72, 144, 216, \(\cdots\)

 

최소공배수 (Least Common Multiple)

공배수 중에서 가장 작은 수

ex)

6과 8의 최소공배수 : 24

10과 20의 최소공배수 : 20

18, 24, 36의 최소공배수 : 72

 

 

 

 

 

최대공약수와 최소공배수 계산하기

최대공약수는 소인수분해의 개념을 이해하면 된다.

12 = 2^2 * 3^1

18 = 2^1 * 3^2

최대공약수는 공통되는 부분인 2^1 * 3^1 = 6이다.

 

이 때, 최소공배수는 모두를 포함하는 개념으로

2^2 * 3^2 = 36이 된다.

 

따라서 다음 관계가 성립한다.

두 수 a, b 에 대하여

a, b의 최소공배수 = a * b / a, b의 최대공약수

 

ex)

12, 18

최대공약수 : 6

최소공배수 : 12 * 18 / 6 = 36

 

18, 24, 36

18과 24의 최대공약수 : 6

18과 24의 최대공배수 : 18 * 24 / 6 = 72

72와 36의 최대공약수 : 36

72와 36의 최소공배수 : 72 * 36 / 36 = 72

 

 

 

 

 

Python 구현

method 1 : 두 수중 작은 수 a부터 1까지 공약수가 되는지 체크한다.

a, b = sorted(map(int, input().split()))
for i in range(a, 0, -1):
    if (a % i == 0) and (b % i == 0):
        break
print(i)
print(int(a * b / i))

12 18
>>> 6
36

장점 : 구현이 간단

단점 : 숫자가 커질 경우 시간에 대한 가성비가 나쁘다.

 

method 2 : 유클리드 호제법

서로 나누었을 때의 나머지가 다른 작은 수 와 나누어 떨어지면 그 나머지가 최대공약수이다.

a, b = sorted(map(int, input().split()))
x, y = a, b
while y:
    x, y = y, x % y
    print(x, y)
print(x)
print(int(a * b / x))

12 18
>>> 18 12
12 6
6 0
6
36

장점 : 숫자가 커져도 계산횟수가 크게 늘어나지 않는다. 따라서 빠르다.

단점 : 생각을 하거나 알고리즘을 외워둬야한다.

 

method 3 : math 라이브러리 활용

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

12 18
>>> 6
36

장점 : 유클리드 호제법을 직접 구현하지 않아도 간편하게 사용가능

단점 : 일부 코딩테스트에서 math라이브러리를 제한하는 경우 사용불가능

 

댓글