https://school.programmers.co.kr/learn/courses/30/lessons/12940
최대공약수를 구하는 문제를 푸는데 O(n)의 시간 복잡도로 해결을 했다. 좀 더 효율적인 알고리즘이 있는데 활용을 하지 못하는 것 같아서 구글링을 해서 더 직관적이고 효율적인 알고리즘을 공부해서 소개하고자 한다.
유클리드 호제법
- 증명
A = B * c + r 일 때, A, B의 최대 공약수는 B, r의 최대 공약수와 같다. 라는 것이다.
전제
1. A와 B의 최대 공약수는 G이다.
2. A = aG, B = bG 일 때 a mod b != 0 이다. (서로소이다.)
증명 순서
1. r = nG 형태로 치환한다.
r = Bc - A = bGc - aG = (bc - a)G
2. r = (bc - a)G, B = bG 일 때 (bc - a) mod b !=0 이면 유클리드 호제법을 증명이 완료된다.
2-1 (bc - a) mod b = 0 이 거짓임을 증명한다.
bc - a = kg, b = hg ( g는 bc - a 와 b의 최대공약수 )
hgc - a = kg
a = kg - hgc = (k - hc)g
a, b는 서로수이기 때문에 g = 1 이다.
따라서 (bc - a) mod b != 0 이다.
- 효율성
유클리드 호제법을 이용하면서 브루드 포트 방식인 O(n)에서 O(log N)으로 개선할 수 있다.
- 코드
//a > b
public int gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
참고 : https://www.baeldung.com/java-greatest-common-divisor
'ps' 카테고리의 다른 글
[백준] B1395 스위치 - 느리게 갱신되는 세그먼트 트리 (0) | 2023.10.31 |
---|---|
[알고리즘] 스패닝 트리 (0) | 2023.10.14 |
[프로그래머스] 고고학 최고의 발견 (0) | 2023.02.16 |
[프로그래머스] 등대 (0) | 2023.02.16 |
[프로그래머스] 퍼즐 조각 채우기 (0) | 2023.02.14 |