일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- knapsack Problem
- Modern C++
- 프로세스 상태
- Zenject
- two pointer
- 8-Puzzle
- PrefixSum
- Gold
- programmers
- BOJ
- LEVEL2
- binary search
- BFS
- Bronze
- Flyweight Pattern
- dirtyflag pattern
- Euclidean
- trie
- Unity
- solid 원칙
- stack
- Project
- effective C++
- SWEA
- algorithm
- level3
- level1
- 3D RPG
- Silver
- 프로그래머스
- Today
- Total
Patrick's Devlog
[Algorithm] 유클리드 알고리즘 본문
1. 최대공약수(Greatest Commom Divisor, GCD)
공약수는 두 수 이상의 여러 수의 공통된 약수를 의미한다. 여기서 최대공약수는 두 수 이상의 여러 수 공약수 중 최대인 수를 가리킨다. 예제를 통해 살펴보자. 여기서 50과 90의 최대공약수를 구해보자
최대 공약수는 10임을 확인할 수 있다.
2. 최소공배수(Lowest Common Multiple, LCM)
공배수는 두 수이상의 여러 수의 공통된 배수를 의미한다. 여기서 최소공배수는 두 수 이상의 여러 수 공배수중 최소인 수를 가리킨다. 예제를 또 하나 살펴보자. 여기서 10과 30의 최소공배수를 구해보자
최소 공배수는 30이 됨을 확인할 수 있다. 최소 공배수는 (두 자연수의 곱 / 최대 공약수)로도 구할 수 있다.
3. 유클리드 호제법(Euclidean Algorithm)
유클리드 알고리즘은 2개의 자연수 또는 정식의 최대공약수를 구하는 알고리즘이다. 2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, 여기서 a > b), a와 b의 최대 공약수는 b와 r의 최대공약수와 같다 이 성질을 이용해 b를 r로 나눈 나머지 r'를 구하고 다시 반복하며 나머지를 구하는 과정을 이어나가다가 나머지가 0이되었을 때, 나누는 수가 a와 b의 최대 공약수이다.
1번의 예제를 통해 위의 방식처럼 최대공약수를 구해본다.
- 90은 50으로 나누어 떨어지지 않으므로, 나머지를 구함 -> 40
- 50은 40으로 나누어 떨어지지 않으므로, 나머지를 구함 -> 10
- 40은 10으로 나누어
떨어짐
따라서 최대공약수는 10임을 알 수 있다. 더 나아가 조금 큰 숫자로 진행해보자. 78696과 19332의 최대 공약수를 구해보자
78696 = 19332×4 + 1368
19332 = 1368×14 + 180
1368 = 180×7 + 108
180 = 108×1 + 72
108 = 72×1 + 36
72 = 36×2 + 0
위의 식대로 진행하면 최대공약수는 36이 나옴을 알 수 있다. 이제 이 방법을 코드로 구현해본다. 간단하게 알고리즘을 정리하면 아래와 같다
1. 입력으로 두 수 A, B(A > B) 주어짐
2. B가 0이면, A를 출력 후 알고리즘 종료
3. A가 B로 나누어 떨어지면, B를 출력하고 알고리즘 종료
4. 그렇지 않으면 A를 B로 나눈 나머지를 새롭게 A에 대입한 후, A와 B를 바꾸고 3번으로 돌아감
이를 코드로 정리하면 재귀방식과 반복문방식 두가지가 존재한다.
- 재귀
int gcd(int A, int B) {
if (B == 0) return A;
else return gcd(B, A % B);
}
- 반복문
int gcd(int A, int B)
{
int R;
while(B)
{
R = A % B;
A = B;
B = R;
}
return A;
}
참고 문서
http://www.tcpschool.com/codingmath/common
https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95
'Algorithm > Algorithms & Data Structure' 카테고리의 다른 글
[Algorithm] 트라이(Trie) 자료구조 (1) | 2024.01.30 |
---|---|
[Algorithm] 위상 정렬(Topological Sort) (1) | 2024.01.22 |
[Algorithm] 투 포인터 알고리즘(Two Pointer Algorithm) (1) | 2022.11.22 |
[Algorithm] Dijkstra Algorithm(다익스트라 알고리즘) (0) | 2022.11.08 |
[Algorithm] Greedy (0) | 2022.10.27 |