문제) 분수의 덧셈
https://school.programmers.co.kr/learn/courses/30/lessons/120808
이번 문제를 풀면서 어떻게 풀지 공책에 써내려가 봤는데.. 막히는 부분이 있었다..
바로 기약분수로 답이 나와야 하는 것!
기약분수로 만들어 내려면 분자와 분모를 그들의 최대공약수로 나누어서 나타내야 하는데, 나는 그 방법을 모른다.
그래서 한 번 공부해 보았다!
최대공약수란,
두 수의 공통된 약수 중에서 가장 큰 수를 뜻한다.
여기서 최대공약수를 구하는 좋은 방법이 있는데, 그것은 바로 유클리드 호제법이다.
유클리드 호제법이란,
두 수의 최대공약수를 찾는 가장 간단하고 효율적인 방법이다.
2개의 자연수 또는 정식(整式)의 최대공약수(Greatest Common Divisor)를 구하는 알고리즘의 하나이다.
- 위키백과
👉 그럼 두수 A 와 B 의 최대공약수는 (나머지가 멸종되기전) 마지막 나머지였던 R3 이 된다.
출처: https://devbirdfeet.tistory.com/257 [새발개발자:티스토리]
//최대공약수 구하기 함수
function greatest(a, b){
if(b === 0) return a;
return greatest(b , a % b);
}
는 어떻게 했나?
function solution(numer1, denom1, numer2, denom2) {
let nenom = (numer1 * denom2) + (numer2 * denom1); // 분자
let numer = denom1 * denom2; //분모
//최대공약수 구하기 함수
function greatest(a, b){
if(b === 0) return a;
return greatest(b , a % b);
}
return [Math.trunc(nenom / greatest(nenom, numer)), Math.trunc( numer/greatest(nenom, numer))];
}
요렇게 했다.
먼저 분자와 분모의 결과를 변수로 선언(nenom, numer)해 주고, return으로 바로 빼 버렸다.
이때 Math.trunc()를 사용해서 소수점을 버려주었다.
최소공배수 구하기
두 수의 곱 / 최대공약수
function lcm(a, b){
return a * b / greatest(a, b);
}
처음에 최대공약수를 떠올리기 전에는 삼항연산자를 이용해서 분모와 분자의 크기 비교를 해야하나.. 싶었었다..ㅋ
유클리드 호제법의 원리를 이해하기는 쉬웠지만 재귀함수가 어려운 나에게는 반복 학습이 답인 걸로!