[TIL-35] 분수의 합 구하기

da.circle·2022년 10월 15일
0

TIL

목록 보기
35/44

주말동안 자바스크립트를 복습하려고 하다가 프로그래머스의 Lv.0 문제를 알게 되었다!
레벨 0이니까 쉬울거라고 생각했던 과거의 나는 반성해야한다😥

😎문제

첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

예) 1 / 2 + 3 / 4 = 5 / 4
따라서 [5, 4]를 return


🙄내 생각

  1. 두 분수의 합을 구해서 분자와 분모를 따로 구한다.
  2. 분자와 분모의 약수를 구한다.
  3. 두 약수들을 비교해서 최대공약수만 뽑는다.
  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로 반복 실행하게 된다.
  }
};
  • 유클리드 호제법(유클리드 알고리즘) : 2개의 수에서 최대공약수를 구하는 알고리즘
    : num1을 num2로 나눈 나머지를 r이라고 하면, num1과 num2의 최대공약수는 num2와 r의 최대공약수와 같다.


→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];
}

나는 삼항연산자를 사용하는게 어색해서 그런지 사용할 생각 자체를 못하는 것 같다.
다른 사람들 코드를 보다가 내 코드를 보면 정말 초보 티가 엄청 난다..
이런 문제들을 자주 풀면서 자바스크립트와 더욱 친해져야겠다!

profile
프론트엔드 개발자를 꿈꾸는 사람( •̀ ω •́ )✧

0개의 댓글