헬리'Daily/꾸준한 알고리즘

[프로그래머스] 코테 (분수의 덧셈)

헬리이 2023. 8. 18. 12:50
728x90

 

 

일단 최종 코드는.. 이렇게 된다...

function gcd(a, b) {
    return b === 0 ? a : gcd(b, a % b);
}

function solution(numer1, denom1, numer2, denom2) {
    // 두 분모의 최소공배수(lcm) 계산
    const lcm = (denom1 * denom2) / gcd(denom1, denom2);
    
    // 각 분자를 두 분모에 맞게 확장
    const newNumer1 = numer1 * (lcm / denom1);
    const newNumer2 = numer2 * (lcm / denom2);
    
    // 두 분수를 더한 분자 계산
    const resultNumer = newNumer1 + newNumer2;
    
    // 결과 분자와 lcm의 최대공약수(commonGcd) 계산
    const commonGcd = gcd(resultNumer, lcm);
    
    // 기약 분수로 나타내기 위해 결과 분자와 lcm을 commonGcd로 나누어 반환
    return [resultNumer / commonGcd, lcm / commonGcd];
}

console.log(solution(1, 2, 3, 4)); // [5, 4]
console.log(solution(9, 2, 1, 3)); // [29, 6]

 

여기너무 헤맸었기 때문에, 정리를 좀 해볼 예정이다. (머리에도 넣고..!) ㅠ

 

 

function gcd(a, b) {
    return b === 0 ? a : gcd(b, a % b);
}

gcd 함수는 두 개의 정수 a와 b를 입력으로 받아서 그들의 최대공약수(Greatest Common Divisor, GCD)를 계산한다.

이 함수는 재귀적인 방법인 유클리드 호제법(Euclidean Algorithm)을 사용하여 최대공약수를 찾아냈는데, 

 

 

이때, 유클리드 호제법은?

유클리드 호제법은 두 수의 최대공약수를 구할 때
  • 두 수 a와 b(a > b)가 주어진다고 가정해 본다. 
  • a를 b로 나눈 나머지를 구합니다. 나머지를 r이라고 하면, r = a % b이다. 
  • 이제 b를 r로 대체하여 다시 나눕니다. 즉, a를 b로 나누는 대신 b를 r로 나눈다.
  • 위의 과정을 반복하여 r이 0이 될 때까지 나머지를 구하고 나누게 된다. 나머지가 0이 되면 그때의 b가 두 수의 최대공약수이다. 
이 과정을 재귀적으로 반복하면서 최종적으로 나머지가 0이 되는 지점에서 앞서 구한 나머지가 두 수의 최대공약수가 되는것이다. 

 

 

 

최대공약수 

최대공약수(Greatest Common Divisor, GCD)는 두 개 이상의 정수의 공통된 약수 중에서 가장 큰 값을 의미한다. 다시 말해, 두 개 이상의 정수를 동시에 나누어 떨어지게 하는 가장 큰 정수이다. 

 

 

이걸 초등학교때..배웠었나..? 다시한번 기억을 다듬어 보고.. 

 

 

 

 

solution 함수 설명

( 주어진 두 분수를 더한 후, 그 결과를 기약 분수로 나타내기 위한 함수)

 

기약분수?

 분자와 분모 사이의 최대공약수가 1인 분수를 말합니다. 즉, 분자와 분모 사이에 더 이상 약수를 공유하지 않는, 더 이상 약분할 수 없는 형태의 분수를 의미합니다.

 

설명)

// 두 분모의 최소공배수(lcm) 계산
    const lcm = (denom1 * denom2) / gcd(denom1, denom2);

lcm: 주어진 두 분모의 최소공배수(LCM)를 계산 하기 위해 분모들의 곱을 분모들의 최대공약수(GCD)로 나누었다.

 

// 각 분자를 두 분모에 맞게 확장
    const newNumer1 = numer1 * (lcm / denom1);
    const newNumer2 = numer2 * (lcm / denom2);
    
    // 두 분수를 더한 분자 계산
    const resultNumer = newNumer1 + newNumer2;
    
    // 결과 분자와 lcm의 최대공약수(commonGcd) 계산
    const commonGcd = gcd(resultNumer, lcm);
    
    // 기약 분수로 나타내기 위해 결과 분자와 lcm을 commonGcd로 나누어 반환
    return [resultNumer / commonGcd, lcm / commonGcd];

 

 

수학에 대해 기초 지식이... 너무 오랜만에하니... 헷갈리고 생소하고...ㅠ

그래서 좀 헤맸다... 

시간도 좀 걸렸던 문제..!!!

 

사실진짜 너무어려웠다.... ㅠ.....

728x90