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

·

2 min read

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

문제

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

(출처) https://school.programmers.co.kr/learn/courses/30/lessons/120808


풀이

function getGCD(a, b) {
  while(b !== 0) {
    let temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}

function solution(numer1, denom1, numer2, denom2) {
    const denom = denom1 * denom2
    const numer = numer1 * denom2 + numer2 * denom1
    const gcd = getGCD(numer, denom);

    return [numer / gcd, denom / gcd];
}
  • 두 분수를 더하고, 결과를 기약분수로 변환하는 문제이다.

  • 분모를 계산해서 denom에 담고, 분자를 계산해서 numer에 담는다. 그리고 getGCD 함수를 이용해서 최대공약수를 계산한 값을 gcd에 담아서 분모와 분자값을 최대공약수로 나눈 값을 반환한다.

유클리드 알고리즘 (= getGCD 함수)

유클리드 알고리즘을 사용해서 최대공약수를 효율적으로 계산할 수 있다.

  • 두 수 ab의 최대공약수는 ba % b의 최대공약수와 같다. (a % bab로 나눈 나머지)

  • 이 과정을 반복해서 b가 0이 된 후 남은 a 값이 최대공약수가 된다.

function getGCD(a, b) {
  while(b !== 0) {       // b가 0이 아닐 때까지 반복
    let temp = b;        // b를 변수 temp에 저장
    b = a % b;           // a를 b로 나눈 나머지를 b에 저장
    a = temp;            // 이전 b 값을 a에 저장
  }
  return a;              // b가 0이 되었을 때 a가 최대공약수
}