[프로그래머스] 분수의 덧셈


문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 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 합니다.

나의 풀이

function solution(numer1, denom1, numer2, denom2) {
  var answer = [];
  let numberResult = numer1 * denom2 + numer2 * denom1;
  let denomResult = denom1 * denom2;
  let maximum = 1;

  for (let i = 1; i <= numberResult; i++) {
    if (numberResult % i === 0 && denomResult % i === 0) {
      maximum = i;
    }
  }

  return [numberResult / maximum, denomResult / maximum];
}

나의 두번째 풀이(Code Refactoring)

function solution(numer1, denom1, numer2, denom2) {
  let Numer = numer1 * denom2 + numer2 * denom1;
  let Denom = denom1 * denom2;

  let min;
  if (Numer < Denom) {
    min = Numer;
  } else {
    min = Denom;
  }
  while (true) {
    if (Numer % min === 0 && Denom % min === 0) {
      return [Numer / min, Denom / min];
    }
    min -= 1;
  }
}

// 1. 분자와 분모를 만들어준다
// 2. 이때 가장 작은수를 먼저 찾는다 분모와 분자중 큰값을 min에 넣어준다
// 3. 분자와 분모가 min으로 나누어 떨어질 때까지 min 값을 감소해서 기약분수로 반환

참고 할 만한 다른 사람의 코드

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];
}

// 1. 유클리드 호제법으로 최대공약수를 쉽게 찾을 수 있다
// 2. 걍 외우자