프로그래머스 - 분수의 덧셈

이한결·2023년 1월 20일
0

프로그래머스

목록 보기
91/107
post-thumbnail

문제 설명

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

제한사항

● 0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예

입출력 예 설명

입출력 예 #1

1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2

9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.

나의 코드

  function solution(numer1, denom1, numer2, denom2) {
                let total = [numer1, numer2, denom1, denom2];
                let mathfractiontwo = [];
                let mathfractionone = [];
                let maximum = 1;

                for (let i = 0; i < total.length; i++) {
                    if (i % 2 == 0) {
                        mathfractiontwo.push(total[i] * total[total.length - 1]);
                    } else {
                        mathfractionone.push(total[i] * total[total.length - 2]);
                    }
                }

                let pluseTop = mathfractiontwo[0] + mathfractionone[0];
                mathfractiontwo.shift();
                mathfractiontwo.unshift(pluseTop);

                for (let i = 0; i <= mathfractiontwo[1]; i++) {
                    if (mathfractiontwo[0] % i === 0 && mathfractiontwo[1] % i === 0) {
                        maximum = i;
                    }
                }

                return [mathfractiontwo[0] / maximum, mathfractiontwo[1] / maximum];
            }

코드 리뷰

이게 맞을까? 싶을정도로 코드가 더럽다.
분수의 덧셈까지는 구현이 되었지만, 약분에서 막혔다.
그래서 약분을 어떻게 하면 좋을까 하다가 이전에 풀었던 최대공약수를
활용하기로 했다. 그 식을 가져와 대입을 하였다.

  1. 모든 파라미터를 배열에 넣습니다.
  2. for문을 돌려서 i가 짝수일 경우(1 / 2) 4를 곱하였다.
  3. 홀수 일 경우(3 / 4) 2을 곱하였다. 즉 분모를 같게 만들어준 것이다.
  4. 그리고 pluesTop에서는 분자를 합하였다.
  5. 마지막으로 배열(mathfraction)의 한곳에 분자를 빼고 4번의 결과 분자를 넣어주었다. 그러면 10 /8이 나온다.
  6. 두번째 for문에서는 i가 0부터 분모인 10까지 i를 증가시키면서 분모와 분자를 i로 나눈 나머지가 0이 되는 값을 maximum으로 정하게 된다.
  7. 그리고 이후에 그 maxinum으로 나눈 것을 배열로 반환한다.
function solution(denum1, num1, denum2, num2) {
    let denum = denum1*num2 + denum2*num1;
    let num = num1 * num2;
    let maxinum = 1
    
      for (let i = 0; i <= denum; i++) {
                    if (denum % i === 0 && num % i === 0) {
                        maximum = i;
                    }
                }

                return [denum / maximum, num / maximum];
            }

매우 코드가 깔끔해졌다. 나는 왜 이렇게 못하는걸까?
분수의 덧셈을 num과 denum에서 끝내버렸다.
이후에 약분을 하였다.

끝!

profile
평범한 삶을 위하여

0개의 댓글