[프로그래머스] 분수의덧셈 - 자바스크립트

Lenny·2023년 1월 3일
0
post-thumbnail

문제

첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

입출력 예


머야 사진 왜케커

풀이

function euclidean (num1, num2) {
    // 최대공약수, 최소공배수 구하기
    // # 유클리드 호재법
    // 1. 큰 수를 작은수로 나눈 나머지를 구한다.
    // 2. 나눴던 수와 나머지로 또 나머지 연산을 한다.
    // 3. 이 과정을 반복한다.
    // 4. 나머지가 0이 됬을때, 마지막 계산에서 나누는 수로 사용된 숫자가 a, b의 최대공약수가 된다.
    let a = num1;
    let b = num2;
    
    // # a, b는 연산을 진행할 변수!
    
    while(a % b !== 0) {
        // 나머지가 0 이 나올때까지 반복한다.
        let r = a % b; // r : 나머지
        if(r !== 0) {
            a = b; // a 부분에 나눴던 수를 넣는다.
            b = r; // b 부분에 나머지를 넣는다.
        }
        // 마지막에 나누는 수로 사용되는 숫자는 b 부분이다.
    }
    
    // # 최대공약수(G)와 최소공배수(L)와의 관계
    // # 여기서 a * b는 처음의 두 숫자 (num1, num2)
    // # a * b = L * G
    // # L = a * b / G 
    
    let lcm =  num1 * num2 / b
    
    // # 최대공약수, 최소공배수를 return
    return [b, lcm]
}

function solution(denum1, num1, denum2, num2) {
    var answer = [];
    // num1과 num2에 대한 최대공약수, 최소공배수 구하기
    const [gcd, lcm] = euclidean(num1, num2);
    
    // # 두 수의 최소공배수는 분모가 되어야함.
    // # 통분했을때 각 분자에 곱해야 하는 값
    // # LCM / num1, LCM / num2
    let value1 = lcm / num1;
    let value2 = lcm / num2;
    
    let newDenum1 = denum1 * value1;
    let newDenum2 = denum2 * value2;
    
    let finalDenum = newDenum1 + newDenum2;
    
    // 기약분수
    // finalDenum과 lcm의 최소 공약수를 구하고, finalDenum, lcm 각각에 대해 최소공약수로 나눠줘야함.
    // # 최소 공약수 구하기
    const [newGcd] = euclidean(finalDenum, lcm);
    
    let answerDenum = finalDenum / newGcd;
    let answerNum = lcm / newGcd;
    
    answer.push(answerDenum);
    answer.push(answerNum);
    
    return answer;
}

수학 머리가 안되서 유클리드 호재법을 이해하는데 꽤 오래걸렸던 문제이다.
최소공배수, 최소공약수는 내가 알기로는 초등학생? 중학생 때 풀었던 문제같은데, 이것을 코드로 작성하려니 너무너무 어려웠다.

수학블로그를 열심히 찾아봐도 이 식을 코드로 표현을 못하니.. 존나 자괴감들었다.

어떻게든 풀긴했지만,, 프로그래머스 0단계에서 벽을 느껴버리다니 갈길이 멀구만요.

이건 머냐?

다른 사람들 풀이를 보다가 이해가 안되는 풀이를 발견했다.

이거는 봐도 모르겠다.
어떤 수학적인 규칙으로 푼건지 감이 안잡힌다.

이렇게 풀이한 블로그를 몇군데 봤는데 디테일한 설명이 있는 블로그를 발견하지 못해 아쉽다.

getGCD로 최소 공약수 구하는건 알겠는데,

맨 처음에 크로스로 곱해서 더하는거는 무슨 이유로 하는지 잘 모르겠다. (진짜 모름 알고싶음)

const num = num1 * num2;

이 부분은 분모를 통일시켜주려는 의도로 작성된 코드인것은 알겠는디..

이 코드도 메모장에 써서 어떤 수학적인 원리인지 분석좀 해봐야겠다.

그럼 20000

참고 블로그 👇

profile
🧑‍💻

0개의 댓글