코딩테스트/프로그래머스

[프로그래머스 Lv.0] 분수의 덧셈- 자바스크립트 풀이, javaScript

조맹구 2023. 7. 21. 16:35

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

 

제한 사항

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

 

입출력 예

numer1 denom1 numer2 denom2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]

 

입출력 예 설명

입출력 예 #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) {
    var answer = [];
    let denom= denom1*denom2; //두 분모의 공배수
    let numer= (numer1*denom2) + (numer2*denom1); 
    let gcd=1 //최대공약수
    for(let i=2; i<= Math.min(denom,numer); i++){
        if(denom%i===0 && numer%i===0) gcd=i;
    }
    answer.push(parseInt(numer/gcd));
    answer.push(parseInt(denom/gcd));
    
    return answer;
}
  • 분모끼리 곱해준 후 denom 변수에 할당. 분자도 그에 맞춰 곱하고 더해준 후 numer 변수에 할당.
  • 분자와 분모의 최대공약수(gcd)를 구한다. (기약분수는 분자와 분모의 공약수가 1로, 그 두 수의 최대 공약수로 나누어주면 된다)
  • gcd 구하기: 두 수 중 작은 수까지 정수를 검사하면서 두 수를 나눈 나머지가 모두 0인 수를 구한다.
  • 마지막으로 분자, 분모 각각을 약분해준 후, parseInt()로 정수로 만들어 answer배열에 push.

다른 사람 풀이

function fnGCD(a, b){
    return (a%b)? fnGCD(b, a%b) : b;
}

function solution(denum1, num1, denum2, num2) {
    let denum = denum1*num2 + denum2*num1;
    let num = num1 * num2;
    let gcd = fnGCD(denum, num); //최대공약수

    return [denum/gcd, num/gcd];
}
  • 내 풀이와 같은 원리지만 최대공약수를 구하는 함수가 더 간결함.

배운 점

  • 재귀함수는 여전히 어렵다.. 원리를 파악하기가..