문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <numer1, denom1, numer2, denom2 < 1,000
풀이
유클리드 호제법을 알고있는 상태라면 쉽지만 그렇지 않다면 상당히 돌아서 풀어야 하는 문제였다.
관건은 분수를 더한 뒤 기약분수로 표현해주는건데, 우선 간단하게 분수를 더해보자면
const solution = (numer1, denom1, numer2, denom2) => {
const [numer, denom] = [numer1*denom2 + numer2*denom1, denom1*denom2];
}
앞뒤 순서 상관없이 분자에 더해야할 분수의 분모를 곱해준 뒤 더해주고, 분모는 서로 곱해줘서 우선 분수의 덧셈을 마무리 한다.
이제 기약분수를 구해야 하는데 유클리드 호제법을 사용해서 최대공약수를 구하는 함수를 만들어보자.
const calcGCD = (a, b) => {
if(b === 0) return a;
else return calcGCD(b, a%b);
}
유클리드 호제법 잘 모르겠다면 해당 링크로 가서 참고해보자.
이제 해당 함수를 이용해 구한 최대 공약수로 더해진 분수의 분자/분모를 나눠주기만 하면 된다.
const calcGCD = (a, b) => {
if(b === 0) return a;
else return calcGCD(b, a%b);
}
const solution = (numer1, denom1, numer2, denom2) => {
const [numer, denom] = [numer1*denom2 + numer2*denom1, denom1*denom2];
const gcd = calcGCD(numer, denom);
return [numer/gcd, denom/gcd];
}