첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 <denum1, num1, denum2, num2 < 1,000
입출력 예
denum1 num1 denum2 num2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]
나의 코드
function solution(denum1, num1, denum2, num2) {
denum = denum1 * num2 + denum2 * num1;
num = num1 * num2;
let array = [];
for (let i = 1; i <= Math.max(denum, num); i++) {
if ((denum / i === parseInt(denum / i)) & (num / i === parseInt(num / i))) {
array.push(i);
}
}
return [denum / Math.max(...array), num / Math.max(...array)];
}
우선 약분을 거치지 않은 상태에서 분자와 분모를 정의하고,
분자와 분모의 최대공약수를 for문으로 구해서
분자와 분모를 나눠주었다.
최대공약수를 구할 때는 약수의 집합을 구해서 Math.max로 구함!
뿌듯~
했다고 생각했는데 충격적인 코드를 보았다.
<최대공약수 구하는 함수>
function fnGCD(a, b){
return (a%b)? fnGCD(b, a%b) : b;
}
처음에는 이게 무슨 함수지? 했는데
숫자를 이것저것 넣어보고 정체를 알게 되었다.
바로 유클리드 호제법 이용하기!
(1) (a,b)=(10,5)
10을 5로 나눈 나머지가 0이므로 5를 반환.
(2) (a,b)=(5,10)
(10,5)
a<b일 경우 자리만 바뀌어서 (1)과 같아지고 5를 반환.
(3) (a,b)=(8,10)
(10,8) //마찬가지로 a<b이므로 자리 바뀜.
(8,2) //
2 반환.
최대공약수 구하는 문제마다 요긴하게 쓸 수 있을 것 같다. 감사합니다!
++나중에 알게 되어서 덧붙인다.
멘토님 왈 "이거슨 재귀함수입니다."
아하 !! 이것이 들어보기만 했던 그 재귀함수 !