본문 바로가기
코딩테스트 공부/프로그래머스

[Coding Test : Java] Lv.0 : 분수의 덧셈

by 규글 2023. 3. 15.

 문제 상황은 다음과 같다.[각주:1]


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


 그냥 단순히 계산만 하면 큰 문제 없겠지만, 그 값을 기약 분수로 나타내야 한다. 그러면 두 수의 최대 공약수를 알아야 한다.

 

코드

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) { 
        int[] set1 = div(numer1, denom1);
        int[] set2 = div(numer2, denom2);
        
        numer1 = set1[0];
        denom1 = set1[1];
        numer2 = set2[0];
        denom2 = set2[1];
        
        int numer = numer1*denom2 + numer2*denom1;
        int denom = denom1*denom2;
        
        int[] answer = div(numer, denom);
        
        return answer;
    }
    
    public static int[] div(int numer, int denom){
        if(numer >= denom){
            for(int i = denom; i >=2; i--){
                if(denom%i == 0 && numer%i == 0){
                    numer /= i;
                    denom /= i;
                    break;
                }
            }
        } else {
            for(int i = numer; i >=2; i--){
                if(denom%i == 0 && numer%i == 0){
                    numer /= i;
                    denom /= i;
                    break;
                }
            }
        }

        int[] result = {numer, denom};
        return result;
    }
}

 필자는 그래서 두 값을 인자로 전달하면, 그 서로소의 값으로 return 해주는 method를 하나 만들었다. 로직은 간단하다. 두 값을 전달했을 때, 그 두 값 중에 작은 값을 기준으로 index를 1씩 감소시키면서 for loop를 만들어준다. 이때 for loop 안에서는 각 값을 index로 나누었을 때 나누어 떨어지는 경우에 해당 index로 나눈 몫을 각각 구해서 break 하여, 두 값을 return 하도록 한 것이다.

 

 필자는 처음에 수학처럼 2부터 나누는 방식을 생각했는데, 역시나 2가 여러 차례 중복된다든지 하는 경우에는 문제를 해결할 수 없음을 인지했다. 또한 break를 걸지 않았을 때 기존 분자와 분모 값 자체는 변하지 않아서, 혹시라도 또다른 index에 해당되는 경우 연산이 한 번 더 진행되어 [0, 0]을 return 하게 되는 문제가 발생한다.

 For loop에서의 loop 시작을 거꾸로 생각해보는 것이 핵심이다.

 

Footnote

댓글