: while 문을 써서 분모를 통합하고, 그만큼을 분자에 곱해주고, 말그대로 분수의 덧셋 패턴을 이용해서 분수를 더해 준다음에 구한 값의 분자, 분모의 공약수를 써서 다시 기약 분수로 나타내면 되는 문제이다. 나는 굳이(?)라기보다는 좀 더 효율적이기에 유클리드 호제법을 통해서 최대공약수를 구했고, 그 값을 이용해서 최소 공배수를 구해서 문제를 풀었다. 유클리드 호제법을 통해서 문제를 풀어도 while문을 쓰지만 완전탐색법을 쓰는 것보다(그 숫자가 커졌을 경우) 훨씬 효율적이므로(시간 복잡도 면에서) 이 방법을 써서 풀었다.
: 코드
function solution(denum1, num1, denum2, num2) {
var answer = [];
// 1) 분모를 최대 공배수로 통합(분자에도 값을 곱해줌)
// 2) 그리고 분자끼리 더해줌
// 3) 결과를 가지고 최대공약수를 구하고, 그둘을 최대공약수로 나눈 값이 정답
const getUclid = (a,b) => {
while(true) {
r = a % b;
if(r===0) {
return b;
}
a = b;
b = r;
}
}
const LCM = getUclid(num1, num2);
const GCM = (num1 * num2) / LCM;
const val1 = denum1 * (GCM / num1);
const val2 = denum2 * (GCM / num2);
const resultVal = val1 + val2;
const resultLCM = getUclid(resultVal, GCM);
answer[0] = resultVal / resultLCM;
answer[1] = GCM / resultLCM;
return answer;
}
피드백
: 오랜만에 알고리즘 문제 풀이에 도전해봤는데 역시나 다까먹었다. 유클리드 호제법도 외워서 풀었어서 결국 인터넷 검색을 통해 푼거나 마찬가지다. 하지만 뭐 다시 외우면 되지 않나?! ㅎ