[알고리즘 프로그래머스] 최대공약수와 최소공배수 (LEVEL 1)
(문제) 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
입력설명
두 수는 1이상 1000000이하의 자연수입니다.
출력설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 리스트로 반환하시오.
테스트케이스
입력예제 | 출력예제 |
---|---|
3 12 | [3,12] |
2 5 | [1, 10] |
해결방법
방법 1
작은 정수 까지 반복문을 돌려서 입력으로 들어오는 두 값 모두 나누어 떨어지는 것이 존재하면 값을 저장한다.
그러면 마지막에 저장되는 값이 최대공약수가 된다.
최소 공배수는 입력으로 들어오는 두값을 곱한 값을 최대공약수로 나누면 나온다.
방법 2
유클리드 호제법
**간단 설명 : **
입력으로 들어오는 두개의 수중에서 큰수에서 작은 수를 나눠서 나오는 나머지를 구한다.
작은 수와 구한 나머지를 나눠서 또 나오는 나머지를 구한다.
이 작업을 반복한다.
큰 % 작 = 나머지1
작 % 나머지1 = 나머지2
나머지1 % 나머지2 = 나머지3 ...
나머지가 없을 경우 나누는 값이 최대공약수가 된다.
최소공배수는 입력으로 들어오는 두개의 값을 곱한 값과 구한 최대 공약수 곱하기 최소공배수와 동일한 값을 가지게 된다.
동작 시각화
코드 방법1
n, m = map(int, input().split())
# 만약 공약수가 없으면 1이 초기값
answer = [1]
# 최대공약수
for i in range(1, n+1):
if n % i == 0 and m % i == 0:
answer[0] = i
# 최소공배수
answer.append(int(n*m/answer[0]))
print(answer)
코드 방법2 (유클리드 호제법)
n, m = map(int, input().split())
if n < m:
n, m = m, n
save = n * m
# 나누어 떨어지지 않을 경우
# 나누어 떨어지지 않은 것과 더 작았던 것
while True:
after_min = n % m
# 나누어 떨어져서 최대 공약수
if after_min == 0:
break
# 작았던 것이 큰것으로
n = m
# 나머지가 작은 것으로
m = after_min
# 두 자연수의 곱 | 최소공배수 곱 최대공약수
return [m, int(save / m)]
댓글남기기