[프로그래머스] Lv.0 분수의 덧셈 JavaScript

Janet·2023년 3월 28일
0

Algorithm

목록 보기
92/314

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 numer1denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 0 <numer1denom1numer2denom2 < 1,000

입출력 예

numer1denom1numer2denom2result
1234[5, 4]
9213[29, 6]

입출력 예 설명

입출력 예 #1

  • 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2

  • 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.

문제풀이

💡 문제풀이 과정

  • 주어진 두 쌍의 분자와 분모로 두 분수의 합을 구해야 하므로 먼저, 분자와 분모를 다음과 같이 구해준다.
    • 분자(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]; //약분하여 리턴
}
profile
😸

0개의 댓글