https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
🤔 유클리드 호제법이란?
유클리드 호제법 공식
임의의 두 자연수 a, b가 주어졌을 때, 둘 중 큰 값을 a라고 가정한다.
a를 b로 나눈 나머지를 n이라고 한다면(a % b = n), n(나머지)이 0일때, b가 최대 공약수(GCD)이다.
만약 n이 0이 아니라면, a에 b값을 다시 넣고 n(나머지)를 b에 대입한 후 n이 0이 될 때까지 a % b를 반복한다.
✔︎ 최대공약수를 유클리드 호제법을 활용해 계산해보기
✍️ 106, 52일 경우 (a = 106, b= 52)
- 106을 52로 나누었을 때 나누어 떨어진다면 52가 최대공약수이겠지만, 나누어 떨어지지 않음
- 나머지가 0일 때까지 다음과 같은 방법을 반복
- 106을 52로 나눈 나머지 -> 2
- 여기서 52를 a로 가져오고 2를 b로 가져와서 a % b = n으로 계속 계산한다. n=0이 될 때까지 나눠주면 된다.
- 52를 2로 나눈 나머지 -> 0
-> 나머지가 0이므로 윗 줄에서 b인 2를 가져와서 최대공약수는 2
✍️ 721, 372일 경우 (a = 721, b= 372)
- 721을 372로 나누었을 때 나누어 떨어진다면 372가 최대공약수이겠지만, 나누어 떨어지지 않음
- 나누어 질 때까지 다음과 같은 방법을 반복
- 721를 372로 나눈 나머지 -> 349
- 여기서 372를 a로 가져오고 349를 b로 가져와서 a % b = n으로 계속 계산한다. n=0이 될 때까지 나눠주면 된다.
- 372를 349로 나눈 나머지 -> 23
- 349를 23으로 나눈 나머지 -> 4
- 나누어 떨어지지 않아서 계속 반복
.
.
.
최대공약수는 1
✔︎ 최소공배수 계산 방법
최소공배수 -> a, b 공통의 배수 중에 최소 값을 의미. 따라서, 둘의 배수(a*b 곱하면 무조건 둘의 배수)를 위에 구해놓은 최대 공약수로 나누면 최소 값인 배수를 구할 수 있다.
따라서, a*b // 위의 최대 공약수
답 = 윗 줄에서 구한 몫
✍️ 답
import sys
a, b = map(int, sys.stdin.readline().split())
# 유클리드 호제법
def gcd(a, b): #최대공약수
remainder = a % b
while remainder > 0:
a = b
b = remainder
remainder = a % b
return b
def lcm(a, b): #최소공배수
return a * b // gcd(a, b) # 곱한 값에서 최대공약수를 나눈 몫
print(gcd(a, b))
print(lcm(a, b))
✔︎ 최대공약수 구하기
a % b를 한다.
나머지가 0이 아닐 때 ( 나머지 > 0), a에 b 대입. b에는 나머지 대입.
계속 반복하다가 나머지가 0일 때 최대공약수는 b이다.
✔︎ 최소공배수 구하기
최소 공배수는 공통의 배수 중에 가장 작은 값.
a*b는 무조건 둘의 배수임.
때문에 a*b를 공통의 약수 중 가장 큰 값(최대공약수 -> 아까 구한 거 활용)로 나누면 된다.
그래서, a * b 해주고 최대공약수로 나눠준다.
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 파이썬 1021 회전하는 큐 | 이해하기 (0) | 2022.03.09 |
---|---|
[알고리즘] 프로그래머스 파이썬 방금그곡 | 이해하기 (0) | 2022.03.06 |
[알고리즘] 백준 파이썬 1929번 소수 구하기 | 쉽게 이해하기 | 자세한 설명 (0) | 2022.03.04 |
[알고리즘] 백준 파이썬 2839번 설탕배달 | 파이썬 입력하는 법 (0) | 2022.03.02 |
[알고리즘] 프로그래머스 #9 핸드폰 번호 가리기 | replace( ) (0) | 2022.01.21 |