0. 문제 설명
- 코테 문제를 풀다가 갑자기 기약분수가 튀어나왔다.. 너무 오랜만에 보는 단어라 순간 기약분수가 뭐지..? 하고 검색해봤는데 초등학교 5학년 때 배우는 수학.. ㅋㅋ 다 까먹었다 🤣
- 손으로 풀라하면 풀 수 있는데 이걸 코딩으로 구현해야 하니 막막함이 올라왔다.. 그래서 구글링 후 유클리드 호제법이라는 알고리즘을 학습!
1. 유클리드 호제법이란?
- 두 양의 정수, 혹은 두 다항식의 최대공약수를 구하는 방법
- 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다.
이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
2. 방법
1) 큰 수를 작은 수로 나눈 나머지를 구한다. (72 % 30)
2) 나누었던 수(B)와 그 나머지(A%B의 결과인 12)로 다시 나머지 연산을 한다.
3) 이 과정을 나머지(A%B)가 0이 될 때까지 반복하며, 0이 된 시점에서의 첫 피연산자(B=6)가 최대공약수가 된다.
GCD(A,B) | A | B | A%B |
GCD(72,30) | 72 | 30 | 12 |
GCD(30,12) | 30 | 12 | 6 |
GCD(12,6) | 12 | 6 (최대공약수) | 0 |
3. 유클리드 호제법을 이용한 답안
// 유클리드 호제법을 이용하여 최대공약수 구하기
const cal_gcd = (a, b) => b ? cal_gcd(b, a % b) : a;
function solution(numer1, denom1, numer2, denom2) {
// 분자 구하기
let numer = numer1 * denom2 + numer2 * denom1;
// 분모구하기
let denom = denom1 * denom2;
// 최대공약수
let gcd = cal_gcd(numer, denom);
// 최대 공약수를 분자 분모에 나누고 배열에 넣기
return [numer / gcd, denom / gcd]
}
4. 참고자료
https://readme.tistory.com/m/44
[ Lv. 1 ] 최대공약수와 최소공배수 - JavaScript
문제 설명 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두
readme.tistory.com
'JAVASCRIPT > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 0단계 - 피자 나눠먹기(2) (0) | 2024.01.18 |
---|---|
[프로그래머스] 0단계 - 최빈값 구하기 (0) | 2024.01.17 |
[프로그래머스] 0단계 - 정수를 나선형으로 배치하기 (0) | 2024.01.15 |
[프로그래머스] 0단계 - 특별한 2차원 배열 (1) | 2024.01.14 |
[프로그래머스] 0단계 - 그림확대 (0) | 2024.01.14 |