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
'헬리'Daily > 꾸준한 알고리즘' 카테고리의 다른 글
[프로그래머스] 코테 (자릿수 더하기) (0) | 2023.08.13 |
---|---|
[프로그래머스] 코테 (모음 제거) (0) | 2023.08.07 |
[프로그래머스] 코테 (배열자르기) (0) | 2023.08.07 |
[프로그래머스] 코테 (최댓값 만들기(1)) (0) | 2023.08.07 |
[프로그래머스] 코테 (문자열안에 문자열) (0) | 2023.08.04 |