코딩 테스트 문제 중에 최대 공약수, 최소 공배수를 요구하는 문제가 있습니다.
그래서 최대 공약수와 최소 공배수를 구할 때 자주 사용되는 알고리즘인 유클리드 호제법에 대해서 정리해보려고 합니다.
목차
- 유클리드 호제법이란
- 3개 이상의 수에 대한 최대 공약수 구하는 법
- 3개 이상의 수에 대한 최대 공배수 구하는 법
- 최대 공약수/최소 공배수 구현(C++)
유클리드 호제법이란
두 수의 최대 공약수를 구하는 알고리즘입니다.
유클리드 호제법을 사용하기 위해서는 MOD 연산에 대해서 알아야합니다.
MOD 연산이란 ?
두 값을 나눈 나머지를 구하는 연산으로,
큰 수를 작은 수로 나눈 나머지를 구합니다.
그렇다면 유클리드 호제법 예시를 들어보도록 하겠습니다.
예를 들어 1112, 695 두 수의 최대 공약수를 구하고자합니다.
그렇다면
첫번째 : 1112 MOD 연산 695 = 417
나눴던 수와 나머지를 또 MOD 연산을 수행합니다.
두번째 : 695 MOD 연산 417 = 278
세번째 : 417 MOD 연산 278 = 139
네번째: 278 MOD 연산 139 = 0
마지막 계산에서 나머지가 0이 되었을 때 나눴던 수가 1112와 695의 최대 공약수가 됩니다.
최대 공약수 139
그리고 최소 공배수를 구하는 방법은 최대 공약수를 알고 있으면 쉽게 구할 수 있습니다.
수학적으로 두 수의 곱 = 두 수의 최대 공약수 * 두 수의 최소 공배수 입니다.
정리하자면 두 수의 최소 공배수 = 두 수의 곱 / 두 수의 최대 공약수 입니다.
3개 이상의 수에 대한 최대 공약수 구하는법
2개의 수가 아닌 3개의 수에 대한 최대 공약수를 구하려면
두 수를 묶어서 최대 공약수를 계산하고, 결과로 나온 최대 공약수와 남은 수를 묶어서 최대 공약수를 구하면 됩니다.
예를 들어서 18, 42, 64의 최대 공약수를 구하려면
42와 18의 최대 공약수를 구합니다.
: 최대 공약수 6
6과 64의 최대 공약수를 구합니다.
: 최대 공약수 2
따라서 18, 42, 64의 최대 공약수는 2입니다.
3개 이상의 수에 대한 최소 공배수 구하는법
2개의 수가 아닌 3개의 수에 대한 최소 공배수를 구하려면
두 수를 묶어서 최소 공배수를 계산하고, 결과로 나온 최소 공배수와 남은 수를 묶어서 최소 공배수를 구하면 됩니다.
예를 들어서 18, 42, 64의 최소 공배수를 구하려면
42와 18의 최대 공약수를 구합니다.
: 최대 공약수 6
42와 18의 최대 공약수가 6 이므로 최소 공배수를 구하면
최소 공배수 = 42 * 18 / 6
최소 공배수 126
결과로 나온 126과 64의 최소 공배수를 구하면
126과 64의 최대 공약수를 구합니다.
: 최대 공약수 2
126과 64의 최대 공약수가 4이므로 최소 공배수를 구하면
최소 공배수 = 126 * 64 / 2
최소 공배수 4032
따라서 18, 42, 64의 최소 공배수는 4032 입니다.
최대 공약수/최소 공배수 구현(C++)
위 내용을 기반으로 최대 공약수를 구하는 함수를 구현하였습니다.
각 파라미터에 값을 전달함으로서 (단, a > b) 최대 공약수를 구할 수 있습니다.
int gcd(int a, int b) {
int c = 0;
while(true) {
c = a % b;
if(c == 0) {
break;
}
a = b;
b = c;
}
return b;
}
최대 공약수 구하는 방법 (2) - 삼항 연산자, 재귀 이용
int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
최소 공배수는 최대 공약수만 알면 되기 때문에
아래와 같이 함수를 작성할 수 있습니다.
int lcm(int a, int b)
{
return a*b/gcd(a,b);
}
'Algorithm' 카테고리의 다른 글
[Algorithm] 유니온 파인드(Union-Find) (0) | 2022.08.28 |
---|---|
[Algorithm] 다익스트라(Dijkstra) (0) | 2022.08.23 |
[Algorithm] 최장 증가 부분 수열(LIS) (0) | 2022.08.17 |
[Algorithm] 에라토스테네스의 체 (0) | 2022.08.02 |
[Algorithm] 모듈러 연산(나머지 연산) (0) | 2022.08.01 |
댓글