알고리즘 문제/다시 풀어볼 것
[백준] 2609 - 최대공약수와 최소공배수(브론즈 1)
GongHwaChun
2022. 10. 13. 12:34
1트
재귀로 풀 수 있는 것은 반복문으로도 풀어보자
최대 공약수 greatest common divisor
최소 공배수 leaest[lowest] common multiple
최대 공약수는 유클리드 호제법으로 구한다.
직접 구해도 되지만 그런 경우는 시간 복잡도가 log(n^2)이다.(1 ~ n/2까지 구해봐야 하니까)
최소 공배수는 두 수 n, m이 있을 때, 두 수 n, m 을 곱하고 그 결과를 두 수 n, m의 최대 공약수로 나눈 수이다.
Python의 경우 내장 라이브러리인 math를 통해서 구할수도 있다.
import math
gcd = math.gcd(10, 20)
lcm = math.lcm(10, 20)
gcd = math.gcd(10, 20, 25)
lcm = math.lcm(10, 20, 25)
유클리드 호제법
자연수 a, b가 있을 때 a > b라고 가정하자.
- a % b 의 값을 구한다. (a를 b로 나눈 나머지 값을 구한다.)
- 두 가지 경우
- a % b 의 값이 0인 경우
b가 최대 공약수다. - a % b 의 값이 0이 아닌 경우
a = b, b = a % b (a에 b의 값을 넣고 , b에 a를 b로 나눈 나머지 값을 넣는다.)
- 1-2 단계를 반복한다.
# greatest common divisor
# 디바^이져
def get_gcd(num1, num2):
if num1 > num2:
a, b = num1, num2
else:
a, b = num2, num1
while b != 0:
remainder = a % b
a = b
b = remainder
return a
def get_gcd_by_recursive(num1, num2):
if num1 > num2:
return __get_gcd_by_recursive(num1, num2)
else:
return __get_gcd_by_recursive(num2, num1)
def __get_gcd_by_recursive(num1, num2):
if num2 == 0:
return num1
return get_gcd_by_recursive(num2, num1 % num2)
# least common multiple
# lowest common multiple
# 최소 공배수는 두 수 n, m을 곱하고 n,m의 최대 공약수로 나눈 값과 같다.
def get_lcm(num1, num2):
gcd = get_gcd(num1, num2)
return int(num1 * num2 / gcd)
num1, num2 = map(int, input().split())
print(get_gcd_by_recursive(num1, num2))
print(get_lcm(num1, num2))