JAVA/Algorithm

[프로그래머스/입문] Lv.0 분수의 덧셈, 자바(Java)

성코 2023. 8. 31. 16:43

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 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) {
        boolean var = (0 < numer1 && numer1 < 1000 && 0 < denom1 && denom1 < 1000 && 0 < numer2 && numer2 < 1000 && 0 < denom2 && denom2 < 1000);
        
        /*
        1. 최대공약수를 활용하여 분모를 같은 크기로 맞추고, 분자도 그에 맞춘다 --> 분모와 분자를 대각선으로 곱하기
        2. 최대공약수를 구하기 위해 두 값(denum, numer)을 비교하여 더 작은 값을 min에 넣고, min까지 반복하면서 최대공약수를 찾는다. (for문 사용)
        3. 구했던 두 수를 각 max(최대공약수)로 나눠서 값을 구한다.
        */
        
        //분자 구하기
        int top1 = (denom1 * numer2); 
        int top2 = (denom2 * numer1);
        int totalTop = top1 + top2;
        
        //분모 구하기
        int bottom = denom1 * denom2;
        
        for(int i = bottom; i >= 1; i--) {
            //i로 분자, 분모가 다 나누어 떨어지는 수가 '최대공약수'
            if(totalTop % i == 0 && bottom % i == 0) {
                //최대공약수로 약분
                totalTop /= i;
                bottom /= i;
            }
        }
        
        int[] answer = {totalTop, bottom};
        
        return answer;
    }
}