728x90
반응형
https://www.acmicpc.net/problem/1934
1934번: 최소공배수
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있
www.acmicpc.net
최소 공배수를 구하는 문제입니다.
제가 예전에 유클리드 호제법에 관한 내용을 포스팅한 적이 있습니다.
gcd(greatest common divisor) 즉, 최대 공약수를 구하는 방법은 아래 링크를 확인해주세요.
2021.05.21 - [파이썬/프로젝트] - [파이썬] 유클리드 알고리즘(Euclidean Algorithm) - 공부하는 도비
[파이썬] 유클리드 알고리즘(Euclidean Algorithm) - 공부하는 도비
오늘은 간단한 코드 하나를 소개해볼까 합니다. 유클리드 알고리즘은 두 정수의 최대공약수를 쉽게 계산할 수 있도록 하는 것입니다. (자세한 유클리드 알고리즘의 설명은 위키피디아를 참고해
yang-wistory1009.tistory.com
다시, 최소 공배수(lcm)와 최대 공약수(gcd) 개념으로 이 문제를 보면,
lcm 은 두 수의 곱에서 최대 공약수를 나누어 준 수인걸 알 수 있습니다. ex) lcm = (36 * 60) / 12

따라서, gcd 를 먼저 구한 뒤, lcm을 계산해줄게요.
import sys
num = int(input())
for i in range(0, num):
a, b = map(int, sys.stdin.readline().split())
c, d = a, b
q, r = 0, 0
while True:
if a < b:
a, b = b, a
q = a // b
r = a - (q * b)
if r == 0:
gcd = b
break
a = b
b = r
print((c * d) // gcd)
위의 식으로 gcd를 구한 뒤, lcm을 구할 수도 있지만,
math 모듈을 import 시켜 간단히 lcm 을 구할 수 도 있습니다.
import math
import sys
num = int(input())
for i in range(0, num):
a, b = map(int, sys.stdin.readline().split())
print(a * b // math.gcd(a, b))
확실히 더 깔끔하네요
import math
import sys
num = int(input())
for i in range(0, num):
a, b = map(int, sys.stdin.readline().split())
print(math.lcm(a, b))
바로 lcm을 구해볼 수 도 있겠죠?
네 이렇게 간단히 문제를 풀어보았습니다.
'Python > Baekjoon' 카테고리의 다른 글
백준 11653번 문제 풀이 - 공부하는 도비 (0) | 2021.10.24 |
---|---|
백준 5355번 문제 풀이 - 공부하는 도비 (0) | 2021.10.24 |
백준 1032번 문제 풀이 - 공부하는 도비 (0) | 2021.10.22 |
백준 2839번 문제 풀이 - 공부하는 도비 (0) | 2021.08.20 |
백준 1193번 문제 풀이 - 공부하는 도비 (1) | 2021.01.23 |