[JS] 분수의 덧셈 programmers 최대 공약수 구하기 재귀함수

0

코딩테스트

목록 보기
12/80
post-thumbnail

🎀 문제

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

📌 기약분수란?

기약 분수는 분자와 분모 사이의 최대 공약수가 1인 분수를 의미한다. 다시 말해, 분수를 더 이상 약분할 수 없는 상태로 만든 분수이다. 분모와 분자의 최대 공약수가 1이라는 것은 이 분수가 둘 사이에 어떠한 공통된 양수로도 나누어지지 않는다는 것을 의미한다.

예를 들어, 분수 4/6은 최대 공약수가 2이므로, 이를 약분하면 2/3이 됩니다. 그러나 2/3은 더 이상 약분할 수 없는 기약 분수이다.

🎀 내 답변

function solution(numer1, denom1, numer2, denom2) {
    var answer = [];
    denom = numer1 * denom2 + numer2 * denom1;
    numer = denom1 * denom2;
    return answer;
}

분수를 더하는 것 까지는 코드로 적어낼 수 있었다.

  • 분모 끼리 곱한 값 = 분모 값
  • 왼쪽 분자 * 오른쪽 분모 = 왼쪽 분자 값
  • 오른쪽 분자 * 왼쪽 분모 = 오른쪽 분자 값

이렇게 구한 다음, answer[0]에 왼쪽 분자 + 오른쪽 분자 값을 넣고,
answer[1]에 분모 값을 넣으려고 했다. 그런데, 당연히 오답!!!!!!!

솔직히 최대 공약수 자체를 어떻게 구하는거였는지 까먹었다.
그래서 노트에 손으로 한번 설명을 적어봄.

두 숫자를 나눌 수 있는 공통된 약수들을 최대한 모아서 다 곱한 값이 최대 공약수이다.

🎀 다른 사람의 코드를 보고 배우자

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]; // 최대공약수로 약분하여 기약분수로 만든다.
}

📌 재귀 함수를 사용하여 최대공약수를 구한다

재귀 함수란, 함수 안에 자신의 함수를 다시 호출하는 함수를 의미한다.
이러한 재귀함수는 자신의 로직을 내부적으로 반복하다가, 일정한 조건이 만족되면 함수를 이탈하여 결과를 도출한다.

재귀 함수 자체는 이해가 가는데, 최대공약수를 구하는 부분에서 이해가 되지 않아서 Chat-GPT에게 설명을 부탁했다...

🪄 도와줘 GPT!

여기서 사용된 알고리즘은 유클리드 호제법(Euclidean Algorithm)입니다. 이 알고리즘은 두 수의 최대 공약수를 구하는 효율적인 방법 중 하나입니다. 알고리즘의 핵심 아이디어는 다음과 같습니다.

  1. 만약 b가 0이면, 최대 공약수는 a가 됩니다. 이는 재귀 호출을 멈추는 기본 조건입니다.
  2. 그렇지 않으면, b로 a를 나눈 나머지를 취합니다. 이 나머지가 새로운 a가 되고, 기존의 b는 새로운 b가 됩니다.
  3. 이후 재귀 호출을 수행합니다. 이때 새로운 a와 b를 인자로 넘깁니다.

이러한 재귀적인 과정을 반복하면, 최종적으로 b가 0이 되는 순간의 a가 최대 공약수가 됩니다.

함수 내용을 자세히 살펴보면, 삼항 연산자를 사용하여 현재의 b가 0이 아닌 경우에는 재귀 호출을 계속하고, 0인 경우에는 현재의 b를 반환하여 재귀 호출을 종료하도록 되어 있습니다.




이번 문제는 몇 번이고 다시 읽고 이해를 해야할 것 같다...

profile
일단 해. 그리고 잘 되면 잘 된 거, 잘 못되면 그냥 해본 거!

0개의 댓글