유클리드 호제법은 두 개의 자연수의 최대공약수(GCD, Greatest Common Divisor)를 구하는 알고리즘입니다. 유클리드 호제법을 통해 최대공약수와 함께 최소공배수를 구할 수 있으며, 이를 활용하는 방법에 대해 정리하려고 합니다.
최대공약수(GCD) & 최소공배수(LCM)
유클리드 호제법을 말하기 전에 최대공약수와 최소공배수의 개념을 간단하게 설명해 보겠습니다.
최대공약수(GCD, Greatest Common Divisor)
- 두 개 이상의 수가 가지는 공통된 약수 중 가장 큰 수를 의미합니다.
- 예를 들어, 12와 18의 최대공약수는 6입니다. 12와 18의 공약수는 1, 2, 3, 6이며, 이 중 가장 약수가 6이기 때문입니다.
최소공배수(LCM, Least Common Multiple)
- 두 개 이상의 수가 모두 공통으로 갖는 배수 중에서 가장 작은 수를 의미합니다.
- 예를 들어, 4와 6의 최소공배수는 12입니다. 4와 6의 배수는 각각 4, 8, 12, ... 와 6, 12, 18, ...이며, 이중 가장 작은 공통 배수는 12이기 때문입니다.
- 두 수를 알고, 최대공약수를 안다면 최소공배수를 구할 수 있습니다. (두 수가 a, b일 때 a * b / GCD(a, b) = LCM)
최대공약수(GCD) 구현 방식
유클리드 호제법은 두 개의 자연수의 최대공약수를 구하는 간단하면서도 효율적인 알고리즘입니다.
- 두 자연수를 a, b로 가정합니다.
- a와 b를 나눈 나머지를 구합니다. (a % b)
- 만약 나머지가 0이면, b가 최대 공약수입니다. 즉, GCD(a, b) = b가 성립합니다.
- 나머지가 0이 아니라면, 나머지를 b, 이전의 b를 a로 하여 2번째로 돌아갑니다.
- 나머지가 0이 될 때까지 위 과정을 반복합니다.
이 과정을 통해 나머지가 0이 되는 순간 b값이 두 자연수 a와 b의 최대공약수가 됩니다.
이를 통해 최대공약수(GCD)를 구현하면 다음과 같습니다.
1. 재귀 함수(Recursive Function)
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
💡 재귀 함수(Recursive Function)란?
함수 자기 자신을 호출하는 것을 허용하는 함수입니다. 이는 함수가 어떤 작업을 수행하기 위해 자기 자신을 다시 호출할 수 있으며, 보통 재귀 호출을 통해 작은 문제를 해결하고, 이를 조합하여 더 큰 문제를 해결하는 데 사용됩니다.
재귀 함수는 보통 기저 조건(base case)과 재귀 호출(recursive call)로 이루어져 있습니다. 기조 조건은 함수가 자기 자신을 호출하지 않고 바로 반환하는 경우로, 재귀를 종료시키는 역할을 합니다. 재귀 호출은 함수가 자기 자신을 호출하여 더 작은 입력 값에 대해 작업을 수행하는 것을 의미합니다. 재귀 호출은 입력 값이 점점 작아지며 입력 값이 기저 조건에 부합될 때 종료됩니다.
2. 반복문(Loop)
public static int gcd(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}
최소공배수(LCM) 구현 방식
최소공배수를 구하는 방법은 최대공약수를 알고 있다면 쉽게 구할 수 있습니다. 두 수가 각각 a, b이고, 이들의 최대 공약수를 gcd(a, b)로 표기한다면, 두 수의 최소 공배수는 a와 b를 곱한 결과를 최대공약수로 나누어주면 됩니다. 즉, 다음과 같은 공식을 사용합니다.

두 수의 최소공배수는 두 수의 곱에 두 수의 최대공약수를 나누어줌으로써 구할 수 있습니다. 예를 들어 두 수가 12와 8일 경우, 이들의 최대공약수는 6입니다. 이를 이용하여 최소공배수를 구한다면 다음과 같습니다.

따라서, 12와 18의 최소공배수는 36입니다.
이를 통해 최소공배수(LCM)를 구현하면 다음과 같습니다.
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
public static int gcd(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}
'알고리즘 > 자료구조' 카테고리의 다른 글
우선순위 큐(Priority Queue) (0) | 2024.04.03 |
---|---|
피보나치 수열(Fibonacci numbers) (1) | 2024.03.17 |
유클리드 호제법은 두 개의 자연수의 최대공약수(GCD, Greatest Common Divisor)를 구하는 알고리즘입니다. 유클리드 호제법을 통해 최대공약수와 함께 최소공배수를 구할 수 있으며, 이를 활용하는 방법에 대해 정리하려고 합니다.
최대공약수(GCD) & 최소공배수(LCM)
유클리드 호제법을 말하기 전에 최대공약수와 최소공배수의 개념을 간단하게 설명해 보겠습니다.
최대공약수(GCD, Greatest Common Divisor)
- 두 개 이상의 수가 가지는 공통된 약수 중 가장 큰 수를 의미합니다.
- 예를 들어, 12와 18의 최대공약수는 6입니다. 12와 18의 공약수는 1, 2, 3, 6이며, 이 중 가장 약수가 6이기 때문입니다.
최소공배수(LCM, Least Common Multiple)
- 두 개 이상의 수가 모두 공통으로 갖는 배수 중에서 가장 작은 수를 의미합니다.
- 예를 들어, 4와 6의 최소공배수는 12입니다. 4와 6의 배수는 각각 4, 8, 12, ... 와 6, 12, 18, ...이며, 이중 가장 작은 공통 배수는 12이기 때문입니다.
- 두 수를 알고, 최대공약수를 안다면 최소공배수를 구할 수 있습니다. (두 수가 a, b일 때 a * b / GCD(a, b) = LCM)
최대공약수(GCD) 구현 방식
유클리드 호제법은 두 개의 자연수의 최대공약수를 구하는 간단하면서도 효율적인 알고리즘입니다.
- 두 자연수를 a, b로 가정합니다.
- a와 b를 나눈 나머지를 구합니다. (a % b)
- 만약 나머지가 0이면, b가 최대 공약수입니다. 즉, GCD(a, b) = b가 성립합니다.
- 나머지가 0이 아니라면, 나머지를 b, 이전의 b를 a로 하여 2번째로 돌아갑니다.
- 나머지가 0이 될 때까지 위 과정을 반복합니다.
이 과정을 통해 나머지가 0이 되는 순간 b값이 두 자연수 a와 b의 최대공약수가 됩니다.
이를 통해 최대공약수(GCD)를 구현하면 다음과 같습니다.
1. 재귀 함수(Recursive Function)
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
💡 재귀 함수(Recursive Function)란?
함수 자기 자신을 호출하는 것을 허용하는 함수입니다. 이는 함수가 어떤 작업을 수행하기 위해 자기 자신을 다시 호출할 수 있으며, 보통 재귀 호출을 통해 작은 문제를 해결하고, 이를 조합하여 더 큰 문제를 해결하는 데 사용됩니다.
재귀 함수는 보통 기저 조건(base case)과 재귀 호출(recursive call)로 이루어져 있습니다. 기조 조건은 함수가 자기 자신을 호출하지 않고 바로 반환하는 경우로, 재귀를 종료시키는 역할을 합니다. 재귀 호출은 함수가 자기 자신을 호출하여 더 작은 입력 값에 대해 작업을 수행하는 것을 의미합니다. 재귀 호출은 입력 값이 점점 작아지며 입력 값이 기저 조건에 부합될 때 종료됩니다.
2. 반복문(Loop)
public static int gcd(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}
최소공배수(LCM) 구현 방식
최소공배수를 구하는 방법은 최대공약수를 알고 있다면 쉽게 구할 수 있습니다. 두 수가 각각 a, b이고, 이들의 최대 공약수를 gcd(a, b)로 표기한다면, 두 수의 최소 공배수는 a와 b를 곱한 결과를 최대공약수로 나누어주면 됩니다. 즉, 다음과 같은 공식을 사용합니다.

두 수의 최소공배수는 두 수의 곱에 두 수의 최대공약수를 나누어줌으로써 구할 수 있습니다. 예를 들어 두 수가 12와 8일 경우, 이들의 최대공약수는 6입니다. 이를 이용하여 최소공배수를 구한다면 다음과 같습니다.

따라서, 12와 18의 최소공배수는 36입니다.
이를 통해 최소공배수(LCM)를 구현하면 다음과 같습니다.
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
public static int gcd(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}
'알고리즘 > 자료구조' 카테고리의 다른 글
우선순위 큐(Priority Queue) (0) | 2024.04.03 |
---|---|
피보나치 수열(Fibonacci numbers) (1) | 2024.03.17 |