[프로그래머스]

[Javascript | 분수의 덧셈] - 유클리드 알고리즘 및 재귀함수

개발잘하고싶음 2023. 3. 2. 21:47

#분수의 덧셈

 

문제

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

 

접근

(1)유클리드 호제법(while문 및 재귀함수)을 통해 최대공약수를 구한 후, (2) 최대공약수로 약분한 분자와 분모를 배열 데이터로 출력함. 참고로 기약 분수는 분자 분모 최대공약수가 1인 경우를 말함.


#관련 학습

 

1-1)while문 - while(조건식){반복할 코드}

while문은 '조건식'의 결과가 true 인경우 코드 블록을 반복적으로 수행합니다.

추가로 초기화구문 및 종료조건(break문), 증감식이 들어가야 한다. 

 

[Javascript] 반복문(2) - while

두 번째 반복문은 while입니다. while while(조건식){ // 반복할 코드 } while문은 '조건식'의 결과가 true 인경우 코드 블록을 반복적으로 수행합니다. 코드 수행 순서는 1. 먼저 조건식을 판단하고, 2. 조

hianna.tistory.com

1-2)break문

break문은 if, switch, for,while문등에서 break문을 만나면 바로 빠져나가는 명령문 입니다. 

continue문과 함께 설명되어 있음.

 

https://www.pinkcoding.com/class/web/JavaScript/js-continue-break/

 

www.pinkcoding.com

2)재귀함수

function f(n) {
    if (n <= 1) {
       return 1 // 종료 조건
    }
    return n + f(n-1) // 재귀함수
}
console.log(f(100)) //5050

함수가 자신을 다시 호출하는 구조로 만들어진 함수이며 종료조건을 설정해줘야 함.

 

[Javascript] 재귀함수

재귀함수 함수가 자신을 다시 호출하는 구조로 만들어진 함수이다. 재귀함수는 종료조건이 있어야 하며, 종료조건을 설정해주지 않으면 무한 반복을 하게된다. 재귀함수로 작성이 되는 코드는

velog.io

3)유클리드 알고리즘 -최대공약수 구하기

유클리드 호제는 재귀호출로 이루어집니다. 나누어서 떨어질 때까지 반복합니다.

 

1071과 1029의 최대공약수를 구하면

1071과 1029은 나누어 떨어지지 않으므로 나눈 나머지를 구한다. 42

1029는 42와 나누어 떨어지지 않으므로 나눈 나머지를 구한다. 21

42는 21로 나누어 떨어진다. 따라서 21이 최대공약수이다.

 

function gcd(a, b) {
  const remainder = a % b;  // 1번
  if (remainder === 0) return b;  // 2번
  return gcd(b, remainder);  // 3번
}
 

[Javascript] 최대공약수 알고리즘 (with 유클리드 알고리즘)

최대공약수 알고리즘은 중학생(?) 정도의 수학을 요구하는 아주 간단한 알고리즘입니다. 그 자체로도 난이도가 어려운 편은 아니지만, 오늘은 유클리드 알고리즘(a.k.a. 유클리드 호제법)이라는

velog.io


#풀이

 

최대공약수로 약분한 분자와 분모를 배열 데이터 출력과 관련하여 어렵게 생각할 필요가 없었다

function solution(numer1, denom1, numer2, denom2) {
    const a = numer1*denom2 + numer2*denom1
    const b = denom1*denom2
    //최대공약수 구하기
    function gcd(a, b) {
    const remainder = a % b;  
    if (remainder === 0){return b}  //종료 조건
    else {return gcd(b, remainder)}; //재귀 함수
    }
   return  [a/gcd(a,b), b/gcd(a,b)]
}

다른 풀이는 다음과 같다.

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 = fnGCD(denum, num); //최대공약수

    return [denum/gcd, num/gcd];
}

#기타 참고링크

 

 

기약 분수 구하기

기약 분수 기약분수는 여러 분들이 초등학교때 많이 들어 봤을 겁니다. 기약분수: 분수로 표현된 분자와 분모가 1 이외의 공통된 약수로 더 이상 나누어 떨어지지 않는 형태가 된 것을 말한다.

dlwjdcks5343.tistory.com