문제
첫 번째 분수의 분자와 분모를 뜻하는 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
함수)
유클리드 알고리즘을 사용해서 최대공약수를 효율적으로 계산할 수 있다.
두 수
a
와b
의 최대공약수는b
와a % b
의 최대공약수와 같다. (a % b
는a
를b
로 나눈 나머지)이 과정을 반복해서
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가 최대공약수
}