[프로그래머스] 분수의 덧셈 (Java)

ggyu_55·2023년 1월 31일
0

알고리즘 

목록 보기
2/5

문제출처 : 링크텍스트


문제 설명

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

풀이방법

유클리드 호제법을 활용하여 최대공약수를 계산하는 작업이 필요한 문제입니다.

  • 분모가 같은 경우와 아닌 경우의 수를 따로 연산합니다.
  • 분모가 같은 경우, 분자끼리 더한 값이 공통분모의 배수인지 확인합니다.
    - 만약 그렇다면, 분자의 합을 공통분모로 나눈값과 1을 담을 배열을 리턴합니다.
    • 그렇지 않다면, 최대 공약수를 계산하여 최대 공약수로 분모와 분자를 각각 나눈 값을 담아 리턴합니다.
  • 분모가 다를 경우, 각각의 분수에 반대편의 분수를 곱하는 방식으로 통분하여 서로 더해준 뒤 최대 공약수를 계산하여 최대 공약수로 분모와 분자를 각각 나눈 값을 담아 리턴합니다.

문제풀이

import java.util.Arrays;

public class Solution {
      public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];
        if(denom1==denom2){
            return checkFraction(numer1+numer2,denom1);
        }
        int gcd=myGCD(numer1*denom2+numer2*denom1,denom1*denom2);
        return new int[] {(numer1*denom2+numer2*denom1)/gcd,denom1*denom2/gcd};
    }

    private int[] checkFraction(int numerSum,int denom) {
        if(numerSum%denom==0){
            return new int[] {numerSum/denom,1};
        }
        int gcd=myGCD(numerSum,denom);
        return new int[]{numerSum/gcd, denom/gcd};
    }
    private int myGCD(int num1,int num2) {
        if (num2 == 0) {
            return num1;
        }
        return myGCD(num2, num1 % num2);
    }
}

0개의 댓글