[프로그래머스 0레벨] 분수의 덧셈 (유클리드 호제법을 이용하여 최대공약수를 구하자)

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

제한사항
0 <denum1, num1, denum2, num2 < 1,000

입출력 예
denum1	num1	denum2	num2	result
   1	 2	      3	     4  	[5, 4]
   9	 2	      1	     3	   [29, 6]

나의 코드

function solution(denum1, num1, denum2, num2) {
 denum = denum1 * num2 + denum2 * num1;
  num = num1 * num2;
  let array = [];
  for (let i = 1; i <= Math.max(denum, num); i++) {
    if ((denum / i === parseInt(denum / i)) & (num / i === parseInt(num / i))) {
      array.push(i);
    }
  }
  return [denum / Math.max(...array), num / Math.max(...array)];
}

우선 약분을 거치지 않은 상태에서 분자와 분모를 정의하고,
분자와 분모의 최대공약수를 for문으로 구해서
분자와 분모를 나눠주었다.

최대공약수를 구할 때는 약수의 집합을 구해서 Math.max로 구함!

뿌듯~
했다고 생각했는데 충격적인 코드를 보았다.

<최대공약수 구하는 함수>

function fnGCD(a, b){
    return (a%b)? fnGCD(b, a%b) : b;
}

처음에는 이게 무슨 함수지? 했는데
숫자를 이것저것 넣어보고 정체를 알게 되었다.

바로 유클리드 호제법 이용하기!
(1) (a,b)=(10,5)
10을 5로 나눈 나머지가 0이므로 5를 반환.
(2) (a,b)=(5,10)
(10,5)
a<b일 경우 자리만 바뀌어서 (1)과 같아지고 5를 반환.

(3) (a,b)=(8,10)
(10,8) //마찬가지로 a<b이므로 자리 바뀜.
(8,2) //
2 반환.

최대공약수 구하는 문제마다 요긴하게 쓸 수 있을 것 같다. 감사합니다!

++나중에 알게 되어서 덧붙인다.
멘토님 왈 "이거슨 재귀함수입니다."
아하 !! 이것이 들어보기만 했던 그 재귀함수 !

참고:
https://kamang-it.tistory.com/entry/AlgorithmEuclidean%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95%EA%B3%BC-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98-%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98

profile
기록에 진심인 개발자 🌿

0개의 댓글