자바스크립트로
최대공약수(Greatest Common Divisor) & 최소공배수(Largest Common Multiple)
구하기
let getGCD = (num1, num2) => {
let gcd = 1;
for(let i=2; i <= Math.min(num1, num2); i++){
if(num1 % i === 0 && num2 % i === 0) gcd = i;
}
return gcd;
}
위 식과 같이 for문과 Math 함수의 min 메소드를 활용해 최대공약수를 구할 수 있다.
두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘
.원리는 다음과 같다.
두 수를 나눈 나머지를 r이라고 할 때, 두 수 중 작은 수와 r의 최대공약수가 두 수의 최대공약수와 같다.
이 과정을 반복하다 나머지가 0이 될 때 나누는 수가 두 수의 최대공약수인 것.
유클리드 호제법에 재귀 방식을 활용해 최대공약수를 한 줄로 구현할 수 있다.
let getGCDwithRecursive = (num1, num2) => (num1 % num2 ? getGCD(num2, num1 % num2) : num2);
재귀 함수가 아니어도 물론 표현할 수 있다.
let getGCDwithWhile = (num1, num2) => {
while(num2 > 0){
let r = num1 % num2;
num1 = num2;
num2 = r;
}
return num1;
}
let getLCM = (num1, num2) =>{
let lcm = 1;
while(true){
if((lcm % num1 == 0) && (lcm % num2 == 0)) break;
lcm++;
}
return lcm
}
두 수를 곱한 값을 최대공약수로 나눈 수이기 때문에, 사실 최대공약수만 알아도 최소공배수를 구할 수 있다.
첫 번째 분수의 분자와 분모인 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2.
위 네 값이 매개변수인 함수 solution.
두 분수를 더한 값을 기약 분수로 나타낼 때,
분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
우선 두 분모의 최소공배수를 구한 뒤, 최소공배수를 각 분모 값으로 나눈 두 개의 값을 해당 분자와 곱한 변수를 구해 문제를 해결하려 했다.
function solution(denum1, num1, denum2, num2) {
let lcm = 1;
while(true) {
if ((lcm % num1 === 0) && (lcm % num2 === 0)) {
break;
}
lcm++;
}; // 최소공배수 구하기
const first = lcm / num1;
const second = lcm / num2;
const numerator = first*denum1 + second*denum2;
const getGCD = (a, b) => a % b === 0 ? b : getGCD(b, a % b);
// 최대공약수 구하기
const gcd = getGCD(numerator, lcm);
// 기약분수로 만들기
return [numerator / gcd, lcm / gcd];
}
이후 다른 풀이를 보니 그냥 서로의 분모와 분자를 교차로 곱한 뒤 더한 값을 바로 최대공약수로 나누면 간단히 해결될 수도 있다는 걸 알았다!