반응형
유클리드 호제법
유클리드 호제법을 알기 전에
먼저 호제법이란 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다.
우리가 알고자 하는 유클리드 호제법은 두 수의 최대공약수를 구하는 알고리즘이다.
(A와 B의 최대공약수는 B와 A를 B로 나눈 나머지의 최대공약수와 같다는 것이다.)
2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면 (단, a > b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다.
즉, gcd(a, b) = gcd(b, r)와 같다는 말이다. (gcd()는 최대공약수를 나타내는 표기이다.)
예시 입력으로 보면,
gcd(24, 18) = gcd(18, 6) = gcd(6, 0)인 것이다!
여기서 b가 0이 되는 순간의 6이 바로 최대공약수가 된다.
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
# 재귀로 나타내는 법
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
최소공배수는 a, b의 곱을 a, b의 최대 공약수(= gcd(a, b))로 나누면 나오게 된다.
def lcm(a, b):
return a * b / gcd(a, b)
1. 2609: 최대공약수와 최소공배수
최대공약수(GCD : Greatest Common Divisor)와 최소공배수(LCM : Least Common Multiple)를 구하는 문제다.
최대공약수는 유클리드 알고리즘을 이용해 구하고, 최소공배수는 a * b를 최대공약수로 나눈 값과 같다.
import sys
input = sys.stdin.readline
a, b = map(int, input().split())
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
print(gcd(a, b))
print(lcm(a, b))
파이썬 math 모듈 에 최대공약수와 최소공배수를 구하는 함수가 내장되어있다고 한다.
import math
a, b = map(int, input().split())
print(math.gcd(a, b))
print(math.lcm(a, b))
Reference)
https://velog.io/@junyp1/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95
반응형
'Problem Solving > Algorithm Concepts' 카테고리의 다른 글
[알고리즘] 이진 트리, 이진 검색 트리 & 백준(이진 탐색 트리, 트리의 순회) (2) | 2022.10.12 |
---|---|
[알고리즘] BFS 뿌셔 DFS 뿌셔 (0) | 2022.10.10 |
[알고리즘] 그래프와 트리, 전위순회, 중위순회, 후위순회& 백준(트리 순회) (1) | 2022.10.08 |
[알고리즘] 스택 & 백준(탑, PPAP) (0) | 2022.10.08 |
[알고리즘] 이분 탐색, 투 포인터 알고리즘 & 백준(두 수의 합, 두 용액) (1) | 2022.10.06 |