코딩 테스트

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

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

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/120808#

 

풀이보기
더보기
function gcd(a, b) {
  while (b !== 0) {
    let temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}

function lcm(a, b) {
  return Math.abs(a * b) / gcd(a, b);
}

function solution(numer1, denom1, numer2, denom2) {
    let commonDenom = lcm(denom1, denom2);
    
    numer1 *= Math.floor(commonDenom / denom1);
    numer2 *= Math.floor(commonDenom / denom2);
    let sumNumer = numer1 + numer2;
    
    let commonGcd = gcd(sumNumer, commonDenom);
    sumNumer /= commonGcd;
    commonDenom /= commonGcd;

    return [sumNumer, commonDenom];
}

분수를 더하려면 공통 분모를 만들어줘야하고, 그러기 위해서는 최소공배수를 구해주면 된다.

기약분수를 만들기 위해서 최대공약수도 필요하므로 최대공약수와 최소공배수를 구하는 함수를 만들어준다.

 

그 후 분모의 최소공배수를 commonDenom에 저장해주고, 각 분자에 분자 * 공통 분모 / 기존 분모 값을 해준다.

그렇게해서 계산된 분자 1, 2를 더해서 sumNumer에 저장해준다.

 

그 다음 기약분수를 만들어주기 위해 최대공약수를 구해서  commonGcd에 넣어주고,

더해진 분자와 공통 분모를 각각 최대공약수로 나눠준다.

마지막으로 계산된 분자와 분모를 리턴 값에 맞게 반환해주면 끝!