코딩 테스트
[프로그래머스 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에 넣어주고,
더해진 분자와 공통 분모를 각각 최대공약수로 나눠준다.
마지막으로 계산된 분자와 분모를 리턴 값에 맞게 반환해주면 끝!