Baekjoon 문제 풀기 (2609번 : 최대공약수와 최소공배수) Python

2609번 : 최대공약수와 최소공배수

1. 문제읽기


유클리드 호제법을 이용한 문제

수학 공식을 이용한 문제는 좀 안나왔으면 좋겠다.

2. 제출 코드


요즘 소수문제만 풀었더니 소수로 문제를 해결할려고 난리를 쳤다.
이렇게 푸는게 아닌 줄 알면서도 오기가 생겨서 예제 1번은 어떻게어떻게 정답을 출력했다.
그러나 처참하게 실패!!

a, b = map(int, input().split())

def func(num):
	ans = []
	prime_arr = primeArray(num)
	while 1:
		for i in prime_arr:
			if num%i ==0:
				if num//i == 1:
					ans.append(num)
					return ans
				ans.append(i)
				num = num//i
				if num in prime_arr:
					ans.append(num)
					return ans

def isPrime(num):
	if num == 1:
		return False
	sq = int(num ** 0.5)
	for i in range(2, sq+1):
		if num%i == 0:
			return False
	return True

def primeArray(num):
	prime_arr = []
	for i in range(2, num+1):
		if isPrime(i):
			prime_arr.append(i)
	return prime_arr

ans_arr = list(set(func(a)-func(b)))
ans = 1
print(ans_arr)
for i in ans_arr:
	ans *= i
print(ans)
a_ans = a//ans
b_ans = b//ans
ans_ans = a_ans*b_ans*ans
if ans_ans == 0:
	print(1)
else:
	print(ans_ans)

3. 공부할 것


유클리드 호제법

최대공약수를 구하는 방법.
a를 b로 나눈 나머지를 r이라고 했을 때, a와 b의 최대공약수는 b와 r의 최대공약수이다.
단, a>b이다.

위 방법으로 b를 나머지를 0이 될때까지 계속 나눠서 최대공약수를 구할 수 있다.

최소공배수 구하기

최대공약수 : gcd = greatest common divisior
최소공배수 : lcm = least common multiple

a = gcd * x
b = gcd * y
(단, x, y는 서로소이다.)
a * b = gcd * gcd * x * y
lcm = gcd * x * y 이므로 lcm = a * b / gcd 가 도출된다.

math모듈 gcd, lcm 메소드

math 내장 모듈에 최대공약수와 최소공배수를 구하는 함수가 있다.

import math

a, b = map(int, input().split())

print(math.gcd(a, b))
print(math.lcm(a, b))
정답 코드

a가 반드시 b보다 크다는 이야기가 없어서 x, y를 따로 지정해주었다.

a가 24이고 b가 18일 때, 유클리드 호제법을 적용하면 24와 18의 gcd는 18과 24%18의 gcd와 같다.
이걸 반복하면 아래와 같이 나타낼 수 있는데, 나머지가 0일 때 x값이 gcd가 된다.
gcd(24,18) -> gcd(18,24%18=6) = gcd(18,6) -> gcd(6, 18%6=0)

최소공배수 구하는 공식이 위에 언급한 것처럼 a*b%gcd라는데, 이해가 잘 안되서 그냥 알고있는 서로소 * gcd로 해결했다.
a와 b를 각각 gcd로 나누면 서로소가 된다.

a, b = map(int, input().split())

x = max(a, b)
y = min(a, b)

while y>0:
    x, y = y, x%y

print(x)
print(x*(a//x)*(b//x))

댓글남기기