첫 번째 분수의 분자와 분모를 뜻하는 numer1
, denom1
, 두 번째 분수의 분자와 분모를 뜻하는 numer2
, denom2
가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
numer1
, denom1
, numer2
, denom2
< 1,000numer1 | denom1 | numer2 | denom2 |
---|---|---|---|
1 | 2 | 3 | 4 |
9 | 2 | 1 | 3 |
function solution(numer1, denom1, numer2, denom2) {
let answer = [];
const denom = getLCM(denom1, denom2);
const numer = numer1 * (denom / denom1) + numer2 * (denom / denom2);
answer[0] = numer / getGCD(numer, denom);
answer[1] = denom / getGCD(numer, denom);
return answer;
}
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;
}
let getLCM = (num1, num2) =>{
let lcm = 1;
while(true){
if((lcm % num1 == 0) && (lcm % num2 == 0)){
break;
}
lcm++;
}
return lcm
}
denom1
과 denom2
의 최소공배수를 구해 denom
(분모)를 구하고, 구한 최소공배수를 이용해 numer
(분자)를 구했다. 그 후에 denom
과 numer
를 둘의 최대공약수로 나누어 기약분수를 구했다.
function fnGCD(a, b){
return (a%b)? fnGCD(b, a%b) : b;
}
function solution(numer1, denom1, numer2, denom2) {
let numer = numer1 * denom2 + numer2 * denom1;
let denom = denom1 * denom2;
let gcd = fnGCD(denom, numer); //최대공약수
return [numer/gcd, denom/gcd];
}
어차피 나중에 최대공약수로 나눠야하기 때문에 분모들의 최소공배수를 구할 필요가 없다. 그리고 최대공약수를 구하는 함수가 정말 자바스크립트스럽게 구한다! 최대한 간결하게 구하는 연습을 해야겠다