최대 공약수(GCD)와 최소 공배수를 구하는 유클리드 호제법에 대해서 알아보자

보통 최대 공약수와 최소 공배수를 구할때는 위와 같은 방법으로 구한다.
그래서 두 수의 공약수를 일일이 나열해서 찾는 방식으로 문제를 풀려고 했다. 그러려면 적어도 for문이 두 수 중에서 제일 큰 수까지 돌면서 같은 공약수가 있는지를 체크해야 한다. 그러면 O(N)의 시간복잡도를 가지게 된다.
하지만, 유클리드 호제법을 사용하면 시간복잡도를 O(log N)으로 줄일 수 있다. 이 방법에 대해서 알아보자.
1. GCD (최대공약수)의 핵심 원리 - 유클리드 호제법
두 수 a, b(a>b)가 있을 때, a를 b로 나눈 나머지를 r이라고 하면, GCD(a,b) = GCD(b,r)이 성립한다.

2. LCM (최소공배수)와의 관계
⭐️ 두 자연수 A, B가 있을 때, 두 수를 곱한 값은 최대공약수와 최소공배수를 곱한 값과 같습니다. ⭐️

이 식을 LCM 기준으로 바꾸면 다음과 같습니다.

3. 구현방법
재귀(Recursive)방식과 반복문(Iterative)방식 2가지 모두 가능합니다.
// 1. 재귀 방식 (가장 깔끔함)
const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));
// 2. 반복문 방식 (스택 오버플로우 걱정 없음)
function getGCD(a: number, b: number): number {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
}
// 3. 최소공배수
const getLCM = (a: number, b: number): number => (a * b) / gcd(a, b);
Tip) 최소공배수를 구할때, a*b를 먼저 계산하면 오버플로우 위험이 있어서, 나누기를 먼저한 후에 곱하면 조금 더 안전한 방법으로 값을 구할 수 있습니다.
출처(이미지)
'알고리즘' 카테고리의 다른 글
| 백준 1912번, 연속합(DP) (0) | 2026.02.12 |
|---|---|
| 소수(Prime) 구하기 - 최적화 (0) | 2026.02.03 |
| 더 좋은 코드 만들기 2 (0) | 2026.01.29 |
| 더 좋은 코드 만들기 (0) | 2025.12.24 |
| 시간/메모리 초과 개선 + 백준 환경이 잘못되었자나(개선후기, 구간 합 구하기, 백준 2042번 세그먼트 트리) (1) | 2025.11.19 |