주말동안 자바스크립트를 복습하려고 하다가 프로그래머스의 Lv.0 문제를 알게 되었다!
레벨 0이니까 쉬울거라고 생각했던 과거의 나는 반성해야한다😥
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
예) 1 / 2 + 3 / 4 = 5 / 4
따라서 [5, 4]를 return
(과정 생각하는 것도 굉장히 오래걸렸다!)
//약수를 구하는 함수
function getDivisor(number) {
let divisor = [];
for (let i = 2; i <= number; i++) {
if (number % i === 0) {
divisor.push(i);
}
}
return divisor;
}
//최대공약수를 구하는 함수
function getBiggestDivisor(arr1, arr2) {
let biggestDivisor = 0;
if (arr2.length > arr1.length) {
for (i in arr2) {
for (j in arr1) {
if (arr2[i] === arr1[j] && arr2[i] > biggestDivisor) {
biggestDivisor = arr2[i];
}
}
}
} else {
for (i in arr1) {
for (j in arr2) {
if (arr1[i] === arr2[j] && arr1[i] > biggestDivisor) {
biggestDivisor = arr1[i];
}
}
}
}
return biggestDivisor;
}
function solution(denum1, num1, denum2, num2) {
//1. 두 분수의 합을 구해서 분자와 분모를 따로 구한다.
let denum = denum1 * num2 + denum2 * num1;
let num = num1 * num2;
console.log("분수의 합-분자 : ", denum);
console.log("분수의 합-분모 : ", num);
//2. 분자와 분모의 약수를 구한다.
let denumsDivisor = getDivisor(denum);
let numsDivisor = getDivisor(num);
console.log("분자 약수 : ", denumsDivisor);
console.log("분모 약수 : ", numsDivisor);
//3. 두 약수들을 비교해서 최대공약수만 뽑는다.
let biggestDivisor = getBiggestDivisor(denumsDivisor, numsDivisor);
console.log("최대공약수 : ", biggestDivisor);
//4. 최대공약수로 나눈 분자와 분모를 배열에 담아서 return
let finalDenums = denum / biggestDivisor;
let finalNums = num / biggestDivisor;
console.log("결과 분자 : ", finalDenums);
console.log("결과 분모 : ", finalNums);
let answer = [];
answer.push(finalDenums);
answer.push(finalNums);
return answer;
}
console.log(solution(2, 3, 5, 6));
const gcd = (num1, num2) => {
//아래 재귀함수를 반복하다가 나머지가 0이되면 num1이 최대공약수이다.
if (num2 === 0) {
return num1;
} else {
//재귀함수
return gcd(num2, num1 % num2);
//gcd의 num1은 num2, num2는 num1 % num2로 반복 실행하게 된다.
}
};
→288이 2304와 1440의 최소공배수이다.
참고1)
최대공약수 구하기 : 유클리드 호제법(youtube)
위키백과-유클리드 호제법
참고2) 재귀함수
function fnGCD(a, b) {
return a % b ? fnGCD(b, a % b) : b;
}
function solution(denum1, num1, denum2, num2){
let denum = denum1*num2 + denum2*num1;
let num = num1 * num2;
let gcd = gcd(denum,num);
return [denum/gcd, num/gcd];
}
나는 삼항연산자를 사용하는게 어색해서 그런지 사용할 생각 자체를 못하는 것 같다.
다른 사람들 코드를 보다가 내 코드를 보면 정말 초보 티가 엄청 난다..
이런 문제들을 자주 풀면서 자바스크립트와 더욱 친해져야겠다!