알고리즘 & 코딩테스트
[백준] 2609번 최대공약수와 최소공배수
Haksae
2022. 3. 18. 04:03
⛏ 문제 파악
- 말 그대로 최대공약수와 최대공배수를 구하는 문제
- 최대공약수(GCD / Greatest Common Divisor) : 두 수의 공통된 약수인 정수로, 약수 중에 제일 큰 수
- 최소공배수(LCM / Least Common Multiple) : 양의 공배수 가운데 가장 작은 수
- 유클리드 호제법으로 문제를 풀면 된다.
- 유클리드 호제법
- 유클리드 호제법은 2개의 자연수 또는 정수의 최대공약수를 구하는 알고리즘의 하나로, 호제법이란 말은 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타낸다.
- 2개의 자연수(또는 정수) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수(gcd)는 b와 r의 최대공약수와 같다.
- 이 성질에 따라, b를 r로 나눈 나머지 r’를 구하고, 다시 r을 r’로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
👉🏻 답안
X, Y = map(int, input().split())
def gcd(a, b): # 최대 공약수 구하는 함수
while b != 0: # b = 0이 될 때까지 반복
r = a % b # a를 b로 나눈 나머지를 r에 대입
a = b # b값을 a로
b = r # r값을 b로 넣어준 뒤 반복
return a # b가 0이면 a값을 리턴
def lcm(a, b): #최소공배수 함수
lcm = (a * b) // gcd(a, b) # a * b 값에 a, b의 최대 공약수를 나누면 최소공배수
return lcm
print(gcd(X,Y))
print(lcm(X,Y))
📑 간단한 설명
- 유클리드 호제법으로 최대공약수를 구하면
- a를 b로 나눈 나머지를 r
- a와 b의 최대공약수는 b와 r의 최대 공약수
- 즉 a와 b의 최대공약수는 b와 a%b의 최대공약수이다.
- 최소공배수를 구하는 것은
- 최대 공약수가 G라면
- a = G * x
- b = G * y
- 최대공약수가 G이기에, x,y는 서로소이다.
- 그러면 최소 공배수는 a * b / G가 된다.
- 물론 이렇게 안해도 파이썬에서 제공하는 강력한 math가 있다..
import math
a, b = map(int, input().split())
print(math.gcd(a, b))
print(math.lcm(a, b))