ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 / JS] Lv.0 분수의 덧셈
    Algorithm/프로그래머스 2022. 12. 19. 14:56
    반응형

    문제 설명

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


    제한사항

    • 0 <denum1, num1, denum2, num2 < 1,000

     

    풀이

    function solution(denum1, num1, denum2, num2) {
        let num = denum1 * num2 + denum2 * num1;
        let denum = num1 * num2;
    
        for (let i = 2; i <= Math.min(num,denum); i++) {
        	if ((num / i < 1) || (denum / i < 1)) break
            if ((num % i === 0) && (denum % i === 0) && (i != 1)) {
            	[num, denum, i] = [num / i, denum / i, i-1]
            }
        }
        return[num, denum]
    }
    function solution(denum1, num1, denum2, num2) {
        let num = denum1 * num2 + denum2 * num1;
        let denum = num1 * num2;
        let getGcd = (bigNum, smallNum) => {
            if (bigNum % smallNum === 0) return smallNum
            else return getGcd(smallNum, bigNum % smallNum)
        }
        let gcd = getGcd(num,denum)
        
        return [num / gcd, denum / gcd]
    }

     

    사고과정

    1. 더한 수의 분자 분모 값을 변수에 저장하자
    2. 2부터 분자 분모 중 작은수까지의 자연수로 분자 분모를 나눠보고 나머지가 0이면 분자 분모값을 갱신하면 되겠는데? 
    3. 같은 값이 반복될 가능성도 있으니 값을 갱신할 때 for문에서 반복을 위해 사용한 인자값도 -1을 더해 갱신하자
    4. 일단 코드가 돌긴 하는데 너무 느리네...
    5. 유클리드 호제법이 있네 이걸 적용해보자
    6. ? 를 쓰면 가독성이 안좋으니까 if문으로 나누는게좋겠다. 함수 구현은 제귀를 써야겠다.
    7. 효율성이 훨씬 개선됐고만

     

    평가

      구현에는 성공했으나 보다 효율성있는 알고리즘의 존재를 뒤늦게 깨달아 헛고생을 했다. 이건 여러번 부딪혀 보고 코드의 효율성을 개선하는 방법을 찾아보면서 익히는 수 밖에 없겠다.

     

    개선점

     

     

    알게된점

    1. 최대공약수를 구할 땐 유클리드 호제법을 사용하자
    2. for 루프 마지막에 continue를 쓰면 오히려 효율성이 떨어진다.

     

     

    반응형

    댓글

Designed by Tistory.