1 minute read

분수의 덧셈

문제 설명

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


제한사항

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


입출력 예

num1 denom1 denom2 num2 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 합니다.

나의 풀이 코드

class Solution {
    private static int gcd(int a, int b){
    if(b == 0) 
        return a; 
    return gcd(b, a % b); 
}
    
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];
        if (0<numer1 && numer1<1000 && 
            0<denom1 && denom1<1000 && 
            0<numer2 && numer2<1000 && 
            0<denom2 && denom2<1000 ){
        
            int denom3 = denom1 * denom2; 
            int numer3 = (numer1 * denom2) + (numer2 * denom1);        
      
            int gcd = gcd(numer3,denom3);
        
            answer[0]= numer3/gcd;
            answer[1]= denom3/gcd;
        }
        return answer;
        
    }
}

마냥 풀다보니 마지막에 분수를 약분을 해야하는데 그러기 위해선 gcd(최대공약수)를 구해야 해서 gcd재귀함수를 만들어서 사용하였다.

배운점

class Solution {
    public int[] solution(int denum1, int num1, int denum2, int num2) {
        int mother = denum1 * denum2;
        int son1 = num1 * denum2;
        int son2 = num2 * denum1;
        int totalSon = son1 + son2;
        for(int i = mother; i >= 1; i--){
            if(totalSon % i == 0 && mother % i == 0){
                totalSon /= i;
                mother /= i;
            }
        }
        int[] answer = {totalSon, mother};
        return answer;
    }
}

다른 사람이 푼 코드는 내 코드와 달리 기약분수를 만들기 위해 반복문을 사용했다는 것이다.

분모를 i로 두고 하나씩 빼가면서 나눠서 제일 처음 조건을 만족한 i가 최대공약수이며 i로 분자,분모를 모두 나누면서 answer를 구한다.

Leave a comment