(java)프로그래머스 코딩 테스트 - 분수의 덧셈

navelop·2023년 8월 13일
0

TIL(CODE)

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

그냥 수학문제로 생각하면 쉬운데
코드로 구현해보려니 갑자기 사고가 멈춘 기분이었다.
그래서 차근차근 생각해보기로..

1 분자 numer1
1 분모 denom1
2 분자 numer2
2 분모 denom2

두 분수의 합 = (numer1)(denom2)+(numer2)(denom1)/(denom1)(denom2)

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        // 결과값을 담을 배열의 길이(요소) 선언
        int[] answer = new int[2];
        
        // 분자와 분모를 순서대로 담을 배열
        // ex) [첫번째 분수 1/2] [두번째 분수 3/4]
        // 분자 (numer1)(denom2)+(numer2)(denom1) -- 8
        answer[0] = numer1 * denom2 + numer2 * denom1;
        // 분모 (denom1)(denom2) -- 10
        answer[1] = denom1 * denom2;
        
        // 약분할 수
        // answer[0]--8, answer[1]--10
        // Math.min(파라미터 1, 파라미터 2); 작은 값 리턴
        // Math.max(파라미터 1, 파라미터 2); 큰 값 리턴
        int min = Math.min(answer[0], answer[1]); //8
        int max = 1; // 1은 초기화값
        
        // 약분할 수 최대값 찾기(기약분수를 위함)
        // 둘을 동시에 나눌 수 있는 최대 공약수 구하기
        for(int i=1; i<=min; i++){
            if(answer[0] % i == 0 && answer[1] % i == 0){
                max = i; // i에 저장 -- 2
            }
        }
        
        // 분수 약분
        // a = a / max 할당 연산자
        answer[0] /= max;
        answer[1] /= max;
        
        return answer;
    }
}

알게 된 다른풀이들

class Solution {
    public int[] solution(int denum1, int num1, int denum2, int num2) {
        int mother = num1 * num2;
        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;
    }
}

유클리드 호제법 사용
유클리드 호제법 : 두 정수의 최대 공약수(GCD, Greatest Common Divisor)를 효율적으로 구하는 알고리즘

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];
        
        answer[0] = numer1 * denom2 + numer2 * denom1;
        answer[1] = denom1 * denom2;
        
        // 최대 공약수 구하기
        int gcd = getGCD(answer[0], answer[1]);
        
        // 기약분수로 약분하기
        answer[0] /= gcd;
        answer[1] /= gcd;
        
        return answer;
    }
    
    // 최대 공약수를 구하는 메서드 (유클리드 호제법 사용)
    public int getGCD(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
}

아직 체득이 안 돼서 계속 보고 적용해보면서 이해를 더 해봐야 될 거 같다.

0개의 댓글