Algorithm/Programmers

[JS 코딩테스트] Lv.0 분수의 덧셈

33e 2025. 2. 7. 14:53

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 numer1denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 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]

 


 

나의 풀이

 

·처음 풀이

   function solution(numer1, denom1, numer2, denom2) {
      let answer = [];
      let numer = numer1 * denom2 + numer2 * denom1 //분자를 모두 더함
      let denom = denom1 * denom2 //분모를 모두 더함
      let gcd = 1;
      
      //최소공약수 구하기
      for(let i = 2; i <= Math.min(denom1,denom2); i++){
          if(denom1 % i === 0 && denom2 % i === 0){
              gcd = i;
          }
      }
      
      answer[0] = numer / gcd
      answer[1] = denom / gcd
      return answer;
  }

 

위의 코드로 짰더니 정확성이 33.3% 가 나왔다. 

다른 사람들의 질문을 참고하며 고려하지 못했던 부분을 찾았다.


 

· 약분이 되지 않음

 

이 점을 고려해 약분을 할 수 있는 코드를 추가했다.

if(a % b == 0 || b % a == 0){
      let min = Math.min(a,b)
      a = a / min;
      b = b / min
  }

해당 코드를 넣어도 정확성이 50% 길래 뭐가 문제인가 찾지 못해서 질문했더니

여전히 약분이 부족하다는 답을 들을 수 있었다.


 

·최종코드

function solution(numer1, denom1, numer2, denom2) {
  let answer = [];
  let numer = numer1 * denom2 + numer2 * denom1 // 분자를 모두 더함
  let denom = denom1 * denom2 //분모를 모두 곱함
  let g = 1; //최소공약수가 될 변수
  
  //최대공약수 구하는 법
  for(let i = 0; i <= Math.min(numer,denom); i++){
        if(numer % i === 0 && denom % i === 0){
            g = i;
        }
  }
  
  //최대공약수로 약분
  let a = numer / g
  let b = denom / g
  
  return answer = [a,b]
}

 

 

약분이 되어야 하는 변수는 numerdenom 이였는데 엉뚱하게 denom1denom2의 최대공약수를 구하고 있으니 틀린 거 였다!

최대공약수를 만드는 for문의 변수를 변경하여 최종 완성하였다

 


다른 사람의 풀이

 

·유클리드 호제법

: 두 양의 정수 a,b(a>b) 일 때, a와 b의 최대공약수는 b와 a/b의 나머지의 최대 공약수와 같다!

function solution(numer1, denom1, numer2, denom2) {
    let answer = [];
    let numer = numer1 * denom2 + numer2 * denom1 //일단 분자를 모두 더함
    let denom = denom1 * denom2 // 분모를 모두 곱함
    
    function gcd (denom1,denom2){
        while(denom2 > 0){
            let r = denom1 % denom2; //두 수의 나머지 구하기
            denom1 = denom2;
            denom2 = r;
        }
        return denom1
    }
    
    let g = gcd(numer, denom)
    
    //약분(이 과정이 빠져있으면 틀렸다고 나옴)
    let a = numer / g
    let b = denom / g
    
    return answer = [a,b]
  }