두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
n | m | return |
---|---|---|
3 | 12 | [3, 12] |
2 | 5 | [1, 10] |
def solution(n, m):
a = {i for i in range(1, n+1) if n % i == 0}
b = {i for i in range(1, m+1) if m % i == 0}
max_common_factor = max(a&b)
min_common_multiple = max_common_factor * (n//max_common_factor) * (m//max_common_factor)
return [max_common_factor, min_common_multiple]
n, m의 약수 목록 set -> set의 교집합 구함 -> 교집합 중 제일 큰 수
def gcdlcm(a, b):
c, d = max(a, b), min(a, b)
t = 1
while t > 0:
t = c % d
c, d = d, t
answer = [c, int(a*b/c)]
return answer
유클리드 호제법을 활용한 풀이법입니다.
유클리드 호제법이란 a > b 일때 a와 b의 최대공약수는 b 와 r(a%b)의 최대공약수와 같다는 공식입니다. 그리고 만일 b가 r로 떨어지지않는다면 다시 (b%r)을 반복해서 r과 k(b%r)를 비교하고 이 과정을 나누어 떨어질 때 까지 반복해서 나오는 값이 최대공약수입니다.
큰 수의 작은 수를 max, min을 써서 구합니다. while문을 통해 앞서 설명했던 나누는 과정을 반복하고, c , d = d, t를 통해 c를 d로 d를 t로 할당합니다.(Python Swap)
두 자연수의 곱 = 최대공약수 * 최소공배수라는 공식을 활용해 리스트에 공식을 풀어씁니다. 최소공배수 = 두 자연수의 곱 / 최대공약수