Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[C++] 백준 1934: 최소공배수 본문
문제
[C++] 백준 1934: 최소공배수 BRONZE 1
https://www.acmicpc.net/problem/1934

접근 방법
백준 1934번은 두 수의 최소공배수(LCM) 를 구하는 문제다.
최소공배수를 직접 구하기보다는, 다음 공식을 이용하면 훨씬 쉽게 해결할 수 있다.
LCM(a, b) = a × b ÷ GCD(a, b)
따라서 문제의 핵심은 최대공약수(GCD) 를 구하는 것이다.
최대공약수는 유클리드 호제법을 이용하면 효율적으로 구할 수 있다.
https://xeungcoding.tistory.com/106
유클리드 호제법 (euclidean-algorithm)
코딩 테스트에서 수학 알고리즘 문제를 풀다 보면 자주 등장하는 개념이 바로 최대공약수(GCD)이다. 최대공약수를 구하는 가장 기본적인 방법은 두 수를 소인수 분해한 뒤, 공통된 소수들의 곱을
xeungcoding.tistory.com
이번에는 두 가지 방식으로 구현했다.
1. 반복문을 이용한 유클리드 호제법
int at = max(a, b), bt = min(a, b);
while (bt != 0)
{
int ret = at % bt;
at = bt;
bt = ret;
}
유클리드 호제법의 핵심은 아래 공식을 반복하는 것이다.
GCD(a, b) = GCD(b, a % b)
- 큰 수를 작은 수로 나눈 나머지를 구하고
- 그 작은 수와 나머지로 다시 계산
- 나머지가 0이 되는 순간의 값이 최대공약수
반복문이 끝나면 at이 최대공약수가 된다.
이후 최소공배수는 a * b / at 으로 계산한다.
2. 재귀를 이용한 유클리드 호제법
같은 원리를 재귀 함수로도 구현할 수 있다.
int GCD(int a, int b)
{
if (a % b == 0)
return b;
else
return GCD(b, a % b);
}
- a % b == 0이면 → b가 최대공약수
- 아니면 → GCD(b, a % b) 호출
재귀적으로 나머지가 0이 될 때까지 호출된다.
메인에서는 이렇게 사용했다.
cout << a * b / GCD(a, b) << '\n';
반복문 방식과 원리는 동일하고, 코드가 더 간결해지는 장점이 있다.
구현 시 주의할 점
- 반드시 최대공약수를 먼저 구한 뒤 a * b / gcd 순서로 계산해야 한다.
- 두 수 중 어떤 것이 더 큰지 상관없이 유클리드 호제법은 정상 동작한다.
코드
반복문 이용
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T = 0;
cin >> T;
for (int i = 0; i < T; i++)
{
int a = 0, b = 0;
cin >> a >> b;
int at = max(a, b), bt = min(a, b);
while (bt != 0)
{
int ret = at % bt;
at = bt;
bt = ret;
}
cout << a * b / at << '\n';
}
}
재귀 이용
#include <iostream>
#include <algorithm>
using namespace std;
int GCD(int a, int b)
{
if (a % b == 0)
return b;
else
return GCD(b, a % b);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T = 0;
cin >> T;
for (int i = 0; i < T; i++)
{
int a = 0, b = 0;
cin >> a >> b;
cout << a * b / GCD(a, b) << '\n';
}
}'PS > BOJ' 카테고리의 다른 글
| [C++] 백준 11725: 트리의 부모 찾기 (0) | 2026.03.03 |
|---|---|
| [C++] 백준 1850: 최소공약수 (0) | 2026.03.02 |
| [C++] 백준 11689: GCD(n, k) = 1 (0) | 2026.03.02 |
| [C++] 백준 1016: 제곱 ㄴㄴ 수 (0) | 2026.03.02 |
| [C++] 백준 1620: 나는야 포켓몬 마스터 이다솜 (0) | 2026.03.01 |