문제 출처: https://www.acmicpc.net/problem/1934
1934번: 최소공배수
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있
www.acmicpc.net
Sol)
#include <stdio.h>
int main(){
int tc;
int num1, num2, gcd, lcm;
scanf("%d", &tc);
while(tc--){
scanf("%d %d", &num1, &num2);
int bigger = num1 > num2 ? num1 : num2;
int smaller = num2 > num1 ? num1 : num2;
int temp;
while(smaller > 0){
temp = bigger;
bigger = smaller;
smaller = temp % smaller;
}
gcd = bigger;
lcm = num1 * num2 / gcd;
printf("%d\n", lcm);
}
return 0;
}
- 풀이 방향
최소 공배수를 쉽게 구하기 위해서는 최대 공약수를 구한 뒤, 두 수의 곱을 최대 공약수로 나눠주면 되겠다. 왜 이렇게 되는지 간단하게 설명해 보자면,
A = g * a, B = g * b 라 하자.
A와 B의 최소 공배수는 g * a * b 이다.
이는 A * B = g^2 * a * b 를 두 수의 최대 공약수인 g로 나눈 값과 같다.
- 풀이
먼저, 유클리드 호제법을 이용해 두 수의 최대 공약수를 구해준 뒤, 두 수의 곱을 이로 나눠 주었다.
- 문제에 대한 사견
유클리드 알고리즘만 알고 있다면 어려운 문제는 아니었다.
유클리드 호제법(Euclidean algorithm)
유클리드 호제법(유클리드 알고리즘)은 두 수의 최대공약수를 구하는 알고리즘이다. 최대 공약수를 구하기 전에, 먼저 약수란 무엇인지 그 정의를 정확히 알고 갈 필요가 있다. - 약수의 정의 두
csloth.tistory.com
'BOJ' 카테고리의 다른 글
백준 11718번 그대로 출력하기 [C언어] (0) | 2022.08.30 |
---|---|
백준 1358번 하키 [C언어] (0) | 2022.08.30 |
백준 3053번 택시 기하학 [C언어] (0) | 2022.08.29 |
백준 2420번 사파리 월드 [C언어] (0) | 2022.08.28 |
백준 3009번 네 번째 점 [C언어] (0) | 2022.08.25 |