개발 기록 남기기✍️

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

코딩 테스트 연습

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

너해동물원 2022. 12. 31. 15:39

🗒️ 문제 설명

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

 

 

⚠️ 제한 사항

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

 

 

👀 입출력 예

denum1 num1 denum2 num2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]

❇️ 나의 풀이

  • 분모가 다른 분수를 덧셈하려면 먼저 분모의 최소공배수를 구해야 한다. while문을 이용해서 1씩 더해가면서 num1, num2로 나눴을 때 나머지가 0인 값을 구한다. 찾으면 break로 그 즉시 반복문을 빠져나간다.
  • num1과 num2가 최소공배수가 되기 위해 곱해야 할 값을 각각 구한다.
  • 분자에 그 값을 각각 곱한 뒤 더해주면 분수 덧셈 시 분자의 값이 된다.
  • 기약분수를 반환해야 하므로 분자와 분모가 공약수를 가지고 있는지 확인하고, 그 값으로 나눠준 값을 배열로 반환한다.
function solution(denum1, num1, denum2, num2) {
	// num1과 num2의 최소공배수 구하기
    let lcm = 1;
   
    while(true){
      if((lcm % num1 == 0) && (lcm % num2 == 0)){
        break;
      }
      lcm++;
    }
    // denum1과 denum2에 곱할 값 구하기
    let x1 = lcm / num1;
    let x2 = lcm / num2;
    
    // 분자 더한 값
    let a1 = (denum1 * x1) + (denum2 * x2);
    
    // a1과 lcm의 약수 확인해서 기약분수화 하기
    let gcd = 1;

    for(let i=1; i<=Math.min(a1, lcm); i++){
        if(a1 % i === 0 && lcm % i === 0){
            gcd = i;
        }
    }

    return [a1/gcd, lcm/gcd]
    
}