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

Ocean·2023년 2월 11일
0

📌문제 설명

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

📌제한 사항

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

📌입출력 예

numer1denom1numer2denom2
1234
9213

📌입출력 예 설명

입출력 예 #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 answer = [];
    
    const denom = getLCM(denom1, denom2);
    const numer = numer1 * (denom / denom1) + numer2 * (denom / denom2);
    answer[0] = numer / getGCD(numer, denom);
    answer[1] = denom / getGCD(numer, denom);
    
    return answer;
}

let getGCD = (num1, num2) => {
    let gcd = 1;

    for(let i=2; i<=Math.min(num1, num2); i++){
        if(num1 % i === 0 && num2 % i === 0){
            gcd = i;
        }
    }

    return gcd;
}

let getLCM = (num1, num2) =>{
	let lcm = 1;
   
    while(true){
      if((lcm % num1 == 0) && (lcm % num2 == 0)){
        break;
      }
      lcm++;
    }
  	return lcm
}

denom1denom2의 최소공배수를 구해 denom(분모)를 구하고, 구한 최소공배수를 이용해 numer(분자)를 구했다. 그 후에 denomnumer를 둘의 최대공약수로 나누어 기약분수를 구했다.

📌다른 사람의 풀이

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

function solution(numer1, denom1, numer2, denom2) {
    let numer = numer1 * denom2 + numer2 * denom1;
    let denom = denom1 * denom2;
    let gcd = fnGCD(denom, numer); //최대공약수

    return [numer/gcd, denom/gcd];
}

어차피 나중에 최대공약수로 나눠야하기 때문에 분모들의 최소공배수를 구할 필요가 없다. 그리고 최대공약수를 구하는 함수가 정말 자바스크립트스럽게 구한다! 최대한 간결하게 구하는 연습을 해야겠다

profile
chick! chick!

0개의 댓글