Computer Science/Algorithm
[알고리즘] 최대공약수와 최소공배수 - javascript
Jiwoo
2022. 4. 16. 14:07
📌 유클리드 호제법
for문을 돌려 찾을 수 있지만 유클리드 호제법
을 알면 훨씬 간단하다.
큰 수(max)와 작은 수(min)가 주어졌을 때, 최대공약수를 구하는 과정을 아래와 같다.
- max % min = e(1)
- min % e(1) = e(2)
- e(1) % e(2) = e(3)
...
e(n-1) % e(n) = 0
- 최대공약수 : e(n)
- 최소공배수 : (max * min) /e(n)
📌 구현
function solution(n, m) {
// 최대공약수 구하는 함수
function u(i, j) {
let e = i % j;
if (e === 0) return j;
return u(j, e);
}
// 최대공배수 반환
alert(u(n,m));
// 최소공배수 반환
alert(n * m / u(n,m));
}
숫자는 큰 수, 작은 수로 나눠서 인자로 넣지 않아도 된다.
만약 n이 작은 수, m이 큰 수라면 n%m = n 이 되어 다음 재귀가 u(m,n)으로 제자리를 찾아 돌아간다.
간추린 코드
function solution(n, m) {
function u(n, m) { return m % n ? u(m % n, n) : n; }
const gcd = u(n, m);
return [gcd, n * m / gcd];
}
여기서 눈여겨 볼 부분은 두 번째 줄에서 조건 설정을 m%n === 0
으로 하지 않고 값이 0이 되게 하면 거짓으로 판명됨을 이용해서 m%n
만으로 설정했다.