첫 번째 분수의 분자와 분모를 뜻하는 numer1
, denom1
, 두 번째 분수의 분자와 분모를 뜻하는 numer2
, denom2
가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
numer1
, denom1
, numer2
, denom2
< 1,000numer1 | denom1 | numer2 | denom2 | result |
---|---|---|---|---|
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
입출력 예 #1
입출력 예 #2
💡 문제풀이 과정
- 주어진 두 쌍의 분자와 분모로 두 분수의 합을 구해야 하므로 먼저, 분자와 분모를 다음과 같이 구해준다.
분자(numerator) = numer1 * denom2 + numer2 * denom1
분모(denominator) = denom1 * denom2
기약 분수
로 나타내야 하므로,분자와 분모의 최대공약수(GCD)
를 구해야 한다.
- cf.
기약 분수
란? 분자와 분모가 서로소(둘의 공약수가 1밖에 없는) 상태여서 더 이상 약분을 할 수 없는 분수를 말한다. (cf.약분
이란 분모와 분자를 그들의 공약수로 나누는 것)- 최대공약수를 구하는 식은 다음과 같다.
const getGcd = (a % b == 0 ? b : getGcd(b, a % b));
const gcd = getGcd(분자, 분모);
하여 분자와 분모의 최대공약수를 구한다.- 마지막으로 분자와 분모를 이 둘의 최대공약수로 약분하여 리턴한다.
return [분자 / gcd, 분모 / gcd];
✅ 답안
function solution(numer1, denom1, numer2, denom2) {
const numer = numer1 * denom2 + numer2 * denom1; //분자
const denom = denom1 * denom2; //분모
const getGcd = (a, b) => (a % b == 0 ? b : getGcd(b, a % b));
const gcd = getGcd(numer, denom); //최대공약수
return [numer / gcd, denom / gcd]; //약분하여 리턴
}