https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
문제
두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000 이하의 자연수이며 사이에 한 칸의 공백이 주어진다.
출력
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
💻 코드
방법 1) 단순 수식
num1, num2 = map(int, input().split())
def GCD(x, y):
for i in range(1, min(x, y) + 1):
if ((x % i == 0) and (y % i == 0)):
result = i
return result
def LCM(x, y):
return x * y // GCD(x, y)
print(GCD(num1, num2))
print(LCM(num1, num2))
방법 2) 유클리드 호제법 사용
num1, num2 = map(int, input().split())
def GCD(x, y):
while y > 0:
x, y = y, x % y
return x
def LCM(x, y):
return x * y // GCD(x, y)
print(GCD(num1, num2))
print(LCM(num1, num2))
방법 3) 내장되어있는 함수 사용
import math
num1, num2 = map(int, input().split())
print(math.gcd(num1, num2))
print(math.lcm(num1, num2))
📝 풀이
최대공약수 : 0이 아닌 두 개 이상의 정수의 공통되는 약수 중에서 가장 큰 수
최소공배수 : 2개 이상의 수의 공배수 가운데서 최소인 수
최대공약수와 최소공배수를 구하는 방법은 다양한 방법이 있다. 그 중 3가지 방법을 사용하여 풀어보았다.
방법 1) 은 가장 일반적인 방법이다.
최대공약수가 공통되는 약수 중 가장 큰 수라는 것이므로 일단 for문을 이용하여 i를 1부터 두 수 중 작은 수까지 두 수를 각각 i로 나눈 나머지가 모두 0인 수, 즉 공약수를 구한다. 그다음 이것을 계속 반복하면서 result라는 변수에 넣게 되면 마지막에는 이 변수에 공약수 중 가장 큰 값이 저장되게 되므로 최대공약수를 구할 수 있게 된다.
방법 2) 는 유클리드 호제법을 사용한 풀이이다.
먼저 유클리드 호제법에 대해 알아보자.
유클리드 호제법이란?
주어진 두 정수의 최대공약수를 구하기 위해 두 수 중에서 큰 수를 상대방(호, 互)의 수로 나누는(제, 除) 일을 최종적으로 나머지가 0이 될 때까지 반복하여 최대공약수를 얻을 수 있는 알고리즘
간단하게 말하면 두 수 중에서 큰 수를 작은 수로 반복해서 나누어 나머지가 0이 될 때까지 반복하여 최대공약수를 구하는 방법이다.
예시를 통해 알아보자.
두 수 24와 18의 최대공약수를 구하려고 한다. 먼저 두 수 중 큰 수 24를 작은 수 18로 나눈 나머지를 구한다. 24 % 18 = 6이 나온다. (이때 =은 등식의 의미이다.) 나머지가 0이 아니므로 다시 큰 수 18을 작은 수 6으로 나눈 나머지를 구한다. 18 % 6 = 0이 나온다. 나머지가 0이 나왔으므로 최대공약수는 6이 된다.
24 % 18 = 6
18 % 6 = 0
∵ 최대공약수 : 6
이것을 코드로 표현하면 다음과 같다.
def GCD(x, y):
while y > 0:
x, y = y, x % y
return x
x, y = y, x % y 라는 코드는 파이썬에서만 사용할 수 있는 여러 값을 동시 대입하면서 swap 하는 코드이다. x에 y를 대입하면서 동시에 y에는 x % y를 대입한다. y에 x % y를 대입하는 과정에서 x는 y를 대입하기 전의 x를 넣는 것이다. 따라서 x = y; y = x % y와는 다른 코드이다.
방법 3) 은 math라는 라이브러리에 이미 내장되어있는 함수를 사용하는 것이다.
math를 import한 후에 함수 사용할 때 math.gcd(숫자 1, 숫자 2), math.lcm(숫자 1, 숫자 2)와 같이 작성하면 최대공약수와 최소공배수를 매우 간단하게 구할 수 있다.
'Algorithm 문제 풀이 > python' 카테고리의 다른 글
[python] 백준 6588번 골드바흐의 추측 문제 풀이 (0) | 2022.06.22 |
---|---|
[python] 백준 1929번 소수 구하기 (0) | 2022.06.21 |
[python] 백준 9012번 괄호 문제 풀이 (0) | 2022.06.17 |
[python] 백준 9093번 단어 뒤집기 문제 풀이 (0) | 2022.06.16 |
[python] 백준 10828번 스택 문제 풀이 (0) | 2022.06.15 |