[JavaScript] 프로그래머스 분수의 덧셈

Gaeun·2022년 10월 9일
1

자바스크립트를 공부하면서 프로그래머스 문제를 하나씩 풀어보고 있다.
다른 문제들은 술술 넘어갔는데... 이 문제에서 며칠을 고생했다. 분명 Lv.0인데.... 왜... (자괴감...)

그래도 결국엔 풀어내서 정리하려고 한다!

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


문제를 처음 읽어보았을 땐 마치 초등학교 4학년 문제를 푸는 것만 같았다. 식은 죽 먹기지! 하면서 풀어보는데... 도저히 어떻게 손을 대야할지 모르겠더라. 최소 공배수, 최대 공약수는 아는데 이걸 코드로 적어본 적이 없었기 때문이다!


그래도 혼자 이것저것 많이 적어보았다.

  1. 일단 소수로 표현하고, 그 소수를 기약분수로 만들어서 분자 분모를 따로 배열에 넣을 생각이었다.그래서 구글에서 decimal to fraction javascript 이라고 구글링해보았는데 실패했다.
  2. 일반적인 분수의 덧셈처럼 분모의 최소 공배수를 구해 통분(몇 년만에 이 단어를 입 밖으로 꺼내보는지 모르겠다)하고, 각각의 분자, 분모에 필요한 수를 곱하려고 했다. 그러면 소인수분해, 최소공배수, 최대공배수 등 모든 것을 구해야만 했다. 이것은 내 능력보다 더 많은 일을 해야하기 때문에 포기했다.
  3. 마지막으로 분자, 분모를 따로 구한 뒤 분자, 분모의 최대 공약수를 구해 분자, 분모에 각각 나누어주기! 그러면 최대 공약수 구하는 공식만 알면 되기 때문에 이 방법을 선택했다.


내가 작성한 코드는 아래와 같다. (최소 공약수 구하기라고 오타를 내었다..)

최대 공약수를 구하는 코드는 구글링하여 알아냈다. 2개의 자연수의 최대 공약수를 구하는 유클리드 호제법이다.

분명 거의 다 구했는데 console에서 자꾸 [NaN, NaN]을 출력해냈다.

이 부분에서 막혔기 때문이다. 배열 요소를 추가하는 것은 막히지 않았다. 하지만 적절한 변수를 작성하지 않았기 때문에 자꾸만 NaN이라고 뜨는 것이었다. 코드 윗 부분에서 let a = denum이라고 작성했기 때문에 위 코드에서도 denum 대신 a를 써넣었더니.. 출력되었다!!!!!!!!!!

적당한 변수를 쓰기. 이것이 내가 며칠을 고생하게 만든 원인이었다.


다른 사람들의 풀이를 보고 다시 간결하게 작성해보았다.

// 최대 공약수 구하기
function cal_gcd(a, b) {
    return a % b === 0 ? b : cal_gcd(b, a % b)
}

function solution(denum1, num1, denum2, num2) {
    let denum = denum1 * num2 + denum2 * num1;
    let num = num1 * num2;
    let gcd = cal_gcd(denum, num);
    
    // 최대 공약수를 분자 분모에 나누고 배열에 넣기
    return [denum / gcd, num / gcd]
}

자괴감이 더 몰려왔다. 어쩜... 같은 코드를 이렇게 깔끔하게 쓸 수 있는지... 조금 더 공부하고 노력해야겠다.

profile
🌱 새싹 개발자의 고군분투 코딩 일기

2개의 댓글

comment-user-thumbnail
2023년 1월 23일

안녕하세요 글 잘 봤습니다!! 근데 프로그래머스문제를 블로깅하는거에대해서 저작권 관련해서 출처를 남기거나 주의해야 하는 사항은 없는건가여?

답글 달기
comment-user-thumbnail
2023년 7월 19일

이 글을 보고 자괴감에 죽고싶어졌다

답글 달기