[ Lv.0 ] 분수의 덧셈

leeda06·2023년 12월 7일
0

코메미들

목록 보기
27/58
post-thumbnail

문제 설명

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

제한사항

  • (0 < \text{numer1}, \text{denom1}, \text{numer2}, \text{denom2} < 1,000)

입출력 예

numer1denom1numer2denom2result
1234[5, 4]
9213[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) {
        int[] answer = new int[2];
        numer1 *= numer2;
        numer2 *= numer1;
        denom1 *= denom2;
        denom2 *= denom1;
        answer[0] = numer1 + numer2;
        answer[1] = denom2;
        
        for(int i = 2; i < Math.min(denom1, denom2); i++){
            if((int)(answer[0] / i) == (answer[0] / i) && (int)(answer[1] / i) == (answer[1] / i)){
                answer[0] = answer[0] / i;
                answer[1] = answer[1] / i;
            }
        }
        
        return answer;
    }
}

설명

  • numer1 *= numer2;와 numer2 *= numer1;에서 변수들이 잘못된 코드임. 각 분수의 분자에는 상대
    분모를 곱해야 하기 때문임.
  • for문이 잘못됨. 최대 공약수를 구해야 하는 부분인데, 분자의 합과 공통 분모를 알아야하지만분자의 합과 분모에 대해 구하고 있기 때문임.
  • for문의 최솟값을 구하는데 이것은 최대 공약수를 찾는 것이기에 잘못된 코드임. 공통분모를 찾도록 변경하여야 함.

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];

        int commonDenom = denom1 * denom2;
        numer1 *= denom2;
        numer2 *= denom1;

        int sumNumer = numer1 + numer2;

        int find = find(sumNumer, commonDenom);

        answer[0] = sumNumer / find;
        answer[1] = commonDenom / find;

        return answer;
    }

    private int find(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }
}

설명

  • commonDenom : 분모를 구하는 식을 초기값으로 지정함.
  • sumNumer : 분자의 합을 구함.
  • find 메소드 : 최대공약수를 구하는 find 메소드를 사용하여 두 분자의 합과 공통 분모의 최대공약수를 구함.
  • answer[1 or 0] : 분자와 분모를 최대공약수로 나누어 기약 분수로 만듦.

기약분수란?

  • 분자와 분모의 공약수가 1뿐이어서 더이상 약분되지 않는 분수이다.
profile
웹솔루션과

0개의 댓글