첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
numer1
, denom1
, numer2
, denom2
< 1,000function solution(numer1, denom1, numer2, denom2) {
// 분자, 분모 구하기
let numer = numer1 * denom2 + numer2 * denom1;
let denom = denom1 * denom2;
// 최소공배수 구하기
const getGcd = (a, b) => (a % b == 0 ? b : getGcd(b, a % b));
let gcd = getGcd(numer, denom);
return [numer / gcd, denom / gcd];
}
그냥 펜 주고 문제 풀라고 하면 개빨리 풀 수 있거든요? ㅠㅠ 이 문제 특히 어려웠어서 정리하려고 했는데 글이 한 세 번 날아가서 개빡쳐있다가 이제 다시 정리한다. 다시 봐도 어려워잉~,,,
친구
의 힘을 빌렸던 것 같다. 필시 과거의 권수경은 그랬을 것. 이해가 안 되면 그냥 외우자.(a, b) => (a % b == 0 ? b : getGcd(b, a % b))
가 된다. 이것을 아예 함수로 빼두어서 사용할 수 있게 했다. 있어보일라고 영어 약자도 찾아서 가져와봄.
유클리드 알고리즘은 두 수의 최대공약수를 찾는 가장 효율적인 방법 중 하나이다.
: 두 정수 a와 b(a > b)에 대해 a를 b로 나눈 나머지를 r이라고 할 때, a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 과정을 나머지가 0이 될 때까지 반복하면 그 때의 b가 a와 b의 최대공약수가 된다.
예를 들어서 48과 18의 최대공약수를 구해본다.
1. 48을 18로 나누면 나머지는 12가 된다.
2. 18을 12로 나누면 나머지는 6이 된다.
3. 12를 6으로 나누면 나머지는 0이다.
따라서 48과 18의 최대공약수는 6이다.
function fnGCD(a, b){
return (a%b)? fnGCD(b, a%b) : b;
}
function solution(denum1, num1, denum2, num2) {
let denum = denum1*num2 + denum2*num1;
let num = num1 * num2;
let gcd = fnGCD(denum, num); //최대공약수
return [denum/gcd, num/gcd];
}
a % b로 나눈 나머지가 0이 아니라면 b와 a%b를 새로운 매개변수로 하여 fnGCD 함수를 새로 호출한다. 나머지가 0이 되면 b를 반환한다. 앞서 말한 유클리드 알고리즘을 구현한 것이다.
나머지 풀이는 동일하다.
var g=(a,b)=>b?g(b,a%b):Math.abs(a),l=(a,b)=>(a*b)/g(a,b),p,q,solution=(a,b,c,d)=>{return p=l(b,d),q=a*p/b+c*p/d,[q/g(p,q),p/g(p,q)]}
g
함수var g=(a,b)=>b?g(b,a%b):Math.abs(a)
var l=(a,b)=>(a*b)/g(a,b)
g(a,b)
는 a와 b의 최대공약수 var solution = (a, b, c, d) => {
return p = l(b, d), q = a * p / b + c * p / d, [q / g(p, q), p / g(p, q)];
}
- 네 개의 인자를 받아서 a/b와 c/d의 합을 계산하고 기약분수 형태로 반환한다.
- p는 두 분모 b와 d의 최소공배수
- q는 두 분수의 합의 분자를 계산한다 공통분모 p를 사용하여 각 분수를 동일한 분모로 확장하고 교차로 곱한 후 더해준다
- 마지막으로 분자 q와 분모 p를 두 수의 최대공약수로 나누어 기약분수 형태로 반환한다
내가 이걸 한 눈에 이해할 수 있다면 참 좋았겠죠... 어려웠음