2개의 자연수 a,b에 대해서 a를 b로 나눈 나머지를 r이라고 하면
a와 b의 최대공약수(GCD)는 b와 r의 최대공약수(GCD)와 같다.
이 성질을 이용하여 다시 b를 r로 나눈 r' 를 구하고, 다시 r을 r'로 나누는 과정을 반복한다.
이 과정을 통해 r'가 0이 되었을 때 나누는 수가 a와 b의 최대공약수가 된다.
기존 이중 반복문을 통한 최대공약수 찾기는 O(min(a,b)) -> O(n) 의 시간복잡도를 가지고 있다.
하지만 유클리드 호제법을 이용하게 되면 나눗셈의 횟수가 log n 이므로 시간 복잡도는 O(log n)이다.
재귀를 통한 유클리드 호제법 사용시 공간복잡도가 나눗셈 횟수인 O(log N) 만큼 더 증가한다.
Why? 호출 스택에서 나눗셈 횟수인 O(log N)만큼 공간을 잡아먹기 때문이다.
다른 알고리즘에서도 재귀보다는 사용시 반복문을 사용하는게 공간복잡도 측면에서 도움이 된다고 하는데 아직 그렇게까지 큰 수는 못만나봐서 모르겠다..
내장 함수가 있을까 하고 StackOverflow를 찾아본결과
#include <algorithm> 의 __gcd(int x, int y) 함수
#include <numeric> 의 __gcd(int x, int y) 함수가 있다.
내 Xcode에서는 둘 다 안된다.. 스택오버플로우에도 gcd 내장함수에 관한 내용은 많지 않아서
그러면 gcd가 되려나 하고 호기심에 돌려보았는데 됐다..!
#include <numeric> 의 gcd(int x, int y) 함수 많이많이 알아갔으면 좋겠다.
gcd(int x, int y)가 되지 않으면 위의 __gcd() 써보자.
XCode 에서 Build한 결과 __gcd() 는 찾을 수 없다고 하여
#include<numeric> 의 gdc() 함수를 사용하였다.
최소공배수 구하기.
최소공배수 구하기는 어렵지 않다.
int x, y 가 주어졌을 때 최대공약수가 gcd(x,y) 라면
최소공배수는 x*y / gcd(x,y) 이다.
증명은 다음과 같다.
lcm 은 최소공배수, gcd는 최대공약수 이다.
간단.
'Study' 카테고리의 다른 글
Count sort -> Input이 매우 많을 때 (1000만) (0) | 2022.01.23 |
---|---|
#include<algorithm>_ reverse / #include<cstdlib> itoa / #include<string> to_string (0) | 2022.01.23 |
#include <vector> / #include <cctype>_to(upper/lower), is(upper/lower) (0) | 2022.01.22 |
백준 1427 소트인사이드 / <cstdlib>_atoi()_문자형변환 (0) | 2022.01.21 |
백준 2822 점수계산 (실버 5) / <algorithm>_sort() (0) | 2022.01.20 |