https://programmers.co.kr/learn/courses/30/lessons/12940
코딩테스트 연습 - 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의
programmers.co.kr
나의 풀이
function solution(n, m) {
const nDivisorList = [];
const mDivisorList = [];
for (let i = 1, j = 1; i <= n, j <= m; i++, j++) {
if (!(n % i)) {
nDivisorList.push(i);
}
if (!(m % j)) {
mDivisorList.push(j);
}
}
const greatCommonFactor = Math.max(...nDivisorList.filter(num => mDivisorList.includes(num)));
const leastCommonMultiple = (n * m) / greatCommonFactor;
return [greatCommonFactor, leastCommonMultiple];
}
두 수의 약수 중 가장 큰 약수를 구하고(최대공약수) 이 수로 나누어 나온 각각의 몫이 서로소이므로,
두 서로소를 곱하면 최소 공배수를 구할 수 있다.
다른 사람의 풀이
function greatestCommonDivisor(a, b) {return b ? greatestCommonDivisor(b, a % b) : Math.abs(a);}
function leastCommonMultipleOfTwo(a, b) {return (a * b) / greatestCommonDivisor(a, b);}
function gcdlcm(a, b) {
return [greatestCommonDivisor(a, b),leastCommonMultipleOfTwo(a, b)];
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(gcdlcm(3,12));
이 코드를 통해 유클리드 호제법이라는 알고리즘을 알게 되었다.
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
유클리드 호제법 - 위키백과, 우리 모두의 백과사전
유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를
ko.wikipedia.org
주어진 a와 b 중 a > b라고 가정하였을 때,
a를 b로 나누었을 때 나머지 r이 존재한다면 a와 b의 최대공약수는 b와 r의 최대공약수와 같다는 원리이다.
이에 따라 나머지가 0이 될 때까지 나누면 그때 나누는 수가 최대 공약수가 된다.
이를 재귀 함수로 구하여 코드를 간결하게 작성하셨다.
알고리즘을 풀면서 수학적 지식이 중요하다는 것을 느낀다.
앞으로도 이렇게 찾아보면서 꾸준히 하나하나 익혀나가야겠다.
'IT > Algorithm' 카테고리의 다른 글
프로그래머스) 멀쩡한 사각형 (0) | 2021.10.28 |
---|---|
프로그래머스) 문자열 압축 (0) | 2021.10.28 |
프로그래머스) 시저 암호 (0) | 2021.10.27 |
프로그래머스) 문자열 내 마음대로 정렬하기 (0) | 2021.10.25 |
프로그래머스) 소수 찾기 (0) | 2021.10.25 |