유클리드 호제법(Euclidean algorithm)
2개의 자연수의 최대공약수를 구하는 알고리즘
비교대상의 두 개의 자연수 n, m (단 n >m)에서 n을 m으로 나눈 나머지를 r이라고 했을때 GCD(n, m) = GCD(m, r)과 같고 r이 0이면 그때 m이 최대공약수이다. 라는 원리를 활용한 알고리즘
GCD (Greatest Common Divisior) - 최대공약수
두 수 혹은 그 이상의 여러 수의 공통인 약수 중 최대 인 수
12의 약수 : 1, 2, 3, 4, 6, 12
8의 약수 : 1, 2, 4, 8
8과 12의 최대 공약수 : 4
# 유클리드 호제법을 이용한 최대 공약수를 구하는 파이썬 코드
def gcd(n, m):
while (n > 0):
m,n = n, m % n
return m
LCM (Largest Common Multiple) - 최소공배수
두 수, 혹은 그 이상의 수들의 공통인 배수 중에서 가장 작은 수
12의 배수 : 12, 24, 36, 48, 60
8의 배수 : 8, 16, 24, 32, 40, 48
8과 12의 최소 공배수 : 24
n * m = xyG^2
-> xyG = 최소공배수
LCM = n * m / 최대공약수 = n * m / gcd(n, m)
# 최소 공배수를 구하는 파이썬 코드
def lcm(n,m):
return int(n*m / gcd(n, m))
위 설명들은 유클리드 호제법을 이용해 알고리즘을 직접 구현하는 방법이고 파이썬에는 Math 함수를 통해 간단하게 구할 수 있다.
- math.gcd() - 최대공약수
import math
print(math.gcd(2, 5))
# 출력 1
- math.lcm() - 최소공배수
import math
print(math.gcd(2, 5))
# 출력 10

찾아보니 math.lcm은 파이썬 3.9부터 사용 가능하다고 한다.
'Study > Algorithm' 카테고리의 다른 글
[Algorithm] LCS (최장 공통 부분 수열, 최장 공통 부분 문자열) (0) | 2021.10.03 |
---|---|
[Algorithm] 점근 표기법, 빅오 표기법(big-O notation) (0) | 2021.08.30 |
[Algorithm] 그리디 (탐욕) 알고리즘 (0) | 2021.08.13 |
[Algorithm] BFS, DFS (0) | 2021.08.01 |
[Algorithm/Python(파이썬)] 에라토스테네스의 체 (0) | 2021.06.18 |
댓글