극동대학교\AI컴퓨터공학과\JAVA/프로그래머스 코딩테스트 입문

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

sundori 2024. 6. 12. 22:34

목차

    #1 분수의 덧셈

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

     

    이번에는 객체지향의 개념을 제대로 이해하기 위해 클래스를 도입해보았다.

    개념

    기약 분수란?

    기약 분수는 분자와 분모의 최대 공약수가 1인 분수를 말한다. 
    즉, 더 이상 약분할 수 없는 상태의 분수이다. 
    예를 들어, 분수 2/4는 1/2로 약분될 수 있기 때문에 기약 분수가 아니다. 
    그러나 1/2는 더 이상 약분할 수 없으므로 기약 분수이다.

     


    최대 공약수(GCD)란?


    최대 공약수는 두 수의 공약수 중 가장 큰 수를 의미한다. 
    예를 들어, 8과 12의 공약수는 1, 2, 4이고, 
    이 중 가장 큰 수는 4이므로 8과 12의 최대 공약수는 4이다.
    더 쉽게 말하자면 8의 공약수는 1, 2, 4, 8이며, 12의 공약수는
    1, 2, 3, 4, 6, 12이다. 이 중 8과 12를 동시에 충족하는 공약수는
    1, 2, 4이며 이 중 가장큰(최대) 공약수는 4이다.

     

    최대 공약수를 사용하는 이유


    분수를 기약 분수로 만들기 위해서는 분자와 분모를 최대 공약수로 나눠야 한다. 
    이렇게 하면 분자와 분모 모두가 더 이상 공통의 약수를 가지지 않게 되어 분수를 최대로 약분할 수 있다. 
    이는 기약 분수를 만들기 위한 핵심 과정이다.

     

    class Solution {
        public int[] solution(int numer1, int denom1, int numer2, int denom2) {
            Sum sum = new Sum(numer1, denom1, numer2, denom2); // Sum 객체를 생성하고 두 분수를 초기화.
            return sum.getAnswer(); // Sum 객체의 getAnswer 메서드를 호출하여 결과를 반환.
        }
    }
    
    class Sum {
        private int numer1; // 첫 번째 분자의 값을 저장할 변수
        private int numer2; // 두 번째 분자의 값을 저장할 변수
        private int denom1; // 첫 번째 분모의 값을 저장할 변수
        private int denom2; // 두 번째 분모의 값을 저장할 변수
    
        Sum(int numer1, int denom1, int numer2, int denom2) {
            set1(numer1, denom1); // 첫 번째 분수의 값을 설정하는 메서드를 호출.
            set2(numer2, denom2); // 두 번째 분수의 값을 설정하는 메서드를 호출.
        }
    
        public void set1(int numer1, int denom1) {
            this.numer1 = numer1; // 첫 번째 분자의 값을 설정.
            this.denom1 = denom1; // 첫 번째 분모의 값을 설정.
        }
    
        public void set2(int numer2, int denom2) {
            this.numer2 = numer2; // 두 번째 분자의 값을 설정.
            this.denom2 = denom2; // 두 번째 분모의 값을 설정.
        }
    
        public int[] getAnswer() {
            int numer = numer1 * denom2 + numer2 * denom1; // 두 분수를 더한 후 분자를 계산.
            int denom = denom1 * denom2; // 두 분수의 분모를 계산.
            int gcd = gcd(numer, denom); // 계산된 분자와 분모의 최대공약수를 구함.
            return new int[] { numer / gcd, denom / gcd }; // 기약 분수 형태로 반환.
        }
    
        private int gcd(int a, int b) {
            while (b != 0) { // 유클리드 알고리즘을 사용하여 최대공약수를 계산.
                int temp = b; // b 값을 임시로 저장.
                b = a % b; // a를 b로 나눈 나머지를 b에 저장.
                a = temp; // a에 이전 b 값을 저장.
            }
            return a; // 최대공약수를 반환.
        }
    }