본문 바로가기

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

[프로그래머스][JAVA] 분수의 덧셈 (LV.0)

반응형

 문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 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 합니다.

 


나의 풀이
class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];
        int max = 0;
        int min = 0;
        int mid = 0;
        
        for(int i=1; i<=denom1 && i<=denom2; i++) {
            if(denom1 % i == 0 && denom2 % i == 0) {
                max = i;
            }
        }
        
        min = (denom1 * denom2) / max;
        
        mid = (min / denom1) * numer1 + (min / denom2) * numer2;
        
        for(int i=1; i<=mid && i<=min; i++) {
            if(mid % i == 0 && min % i == 0) {
                max = i;
            }
        }
        
        if(mid % max == 0 && max != 1) {
            answer[0] = mid / max;
            answer[1] = min / max;
        } else {
            answer[0] = mid;
            answer[1] = min;
        }
        
        return answer;
    }
}

 

다른 사람의 풀이
class Solution {
    public int GCD(int num1, int num2) {
        if (num1 % num2 == 0)
            return num2;
        return GCD(num2, num1 % num2);
    }

    public int[] solution(int denum1, int num1, int denum2, int num2) {
        int[] answer;

        denum1 *= num2;
        denum2 *= num1;

        answer = new int[]{denum1 + denum2, num1 * num2};

        int greatest_common_divisor = GCD(answer[0], answer[1]);
        answer[0] /= greatest_common_divisor;
        answer[1] /= greatest_common_divisor;

        return answer;
    }
}
728x90
반응형