티스토리 뷰
'유클리드 호제법'이란?
유클리드 호제법(혹은 유클리드 알고리즘)은 빠르게 최대공약수(GCD)를 구하는 알고리즘입니다.
참고로 GCD는 Greatest Common Divisor의 약어!
LCM은 Least Common MultiPle의 약어!
'유클리드 호제법'의 원리
두 자연수 a, b가 주어졌을 때,
a를 b로 나눈 나머지가 temp라고 하면,
temp가 0일 때 b가 최대공약수(GCD)입니다.
만약 temp가 0이 아니면
a에 b값을 넣고, b에 temp값을 넣은 다음
위 과정을 반복합니다.
'유클리드 호제법'의 구현 방법
반복문을 이용해 구현하거나
재귀함수를 이용해서 구현할 수 있습니다.
먼저 반복문을 이용해 구현하는 법을 소개하겠습니다.
int gcd(int a, int b) {
int temp;
while (b != 0) {
temp = a % b;
a = b;
b = temp;
}
return a;
}
b가 0이 될 때까지
반복문을 돌게됩니다.
직접 뇌버깅을 해봅시다.
a = 6, b = 4라고 가정합니다.
b는 0이 아니니까
temp는 2가 됩니다.
그 후 a와 b는 각각 4, 2가 됩니다.
또, b는 0이 아니니까
temp는 0이 됩니다.
그 후 a와 b는 각각 2와 0이 됩니다.
이 때, b는 0이 되므로
리턴되는 a가 최대공약수(GCD)라고 할 수 있습니다.
마찬가지로, 재귀함수는 다음과 같이 구현할 수 있습니다.
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
gcd(b, a%b);
}
}
재귀함수로 구현했을 시에는
swap을 위한 과정이 필요없다는 장점이 있지만
재귀함수의 특성상 메모리를 많이 잡아먹기도 합니다.
이렇게 최대공약수(GCD) 구하는 법을 알아봤습니다.
다음으로는 최소공약수(LCM)를 알아보겠습니다.
최소공약수(LCM)을 구하기 위해서는 아래와 같은 성질을 이용합니다.
a * b = gcd(a, b) * lcm(a, b)
이를 이용해서 구현하면 아래와 같습니다.
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
이만 글을 마치겠습니다.
감사합니다.
알고리즘은 알면 알수록 어렵습니다.
개발자 꿈꾸는 주니어들 도망가.
'Dev.Basic > 알고리즘' 카테고리의 다른 글
Dynamic Programming VS Memoization (1) | 2020.01.19 |
---|---|
[c++] DFS(Depth First Search) 알고리즘 (0) | 2019.09.19 |
[c++] BFS(Breadth First Search) 알고리즘 (0) | 2019.09.19 |
- Total
- Today
- Yesterday
- isempty
- aws
- dp
- 백준
- 서머코딩
- dfs
- 구슬탈출
- ios
- datastructure
- 자료구조
- 이진트리
- 시뮬레이션
- BFS
- count
- SummerCoding
- 컬렉션
- Collection
- 호제법
- 삼성역량테스트
- 알고리즘
- 스위프트
- Swift
- 코딩테스트
- Programmers
- c++
- Xcode
- 프로그래머스
- ec2
- algorithm
- 깊이우선탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |