JAVASCRIPT/코딩테스트

[프로그래머스] 0단계 - 분수의 덧셈 (유클리드 호제법)

예글 2024. 1. 16. 12:58

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