ALGORITHM/코딩 기초 트레이닝

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

jki09871 2024. 8. 1. 20:33

 

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

제한사항
0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예
numer1	denom1	numer2	denom2	result
1	2	3	4	[5, 4]
9	2	1	3	[29, 6]

입출력 예 설명
입출력 예 #1
1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2
9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.
 ----------------------------------------------------------------------------------
public class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        // 공통 분모를 구합니다.
        int commonDenom = denom1 * denom2;
        
        // 각 분수의 분자를 공통 분모에 맞추어 변환한 후 더합니다.
        int newNumer1 = numer1 * denom2;
        int newNumer2 = numer2 * denom1;
        int sumNumer = newNumer1 + newNumer2;
        
        // 분자와 분모의 최대공약수를 구합니다.
        int gcd = gcd(sumNumer, commonDenom);
        
        // 기약 분수로 변환합니다.
        int reducedNumer = sumNumer / gcd;
        int reducedDenom = commonDenom / gcd;
        
        return new int[] {reducedNumer, reducedDenom};
    }
    
    // 최대공약수를 구하는 함수
    private int gcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        return gcd(b, a % b);
    }
    
    public static void main(String[] args) {
        Solution sol = new Solution();
        
        // 테스트 케이스
        int[] result1 = sol.solution(1, 2, 3, 4);
        System.out.println("[" + result1[0] + ", " + result1[1] + "]"); // 출력: [5, 4]
        
        int[] result2 = sol.solution(9, 2, 1, 3);
        System.out.println("[" + result2[0] + ", " + result2[1] + "]"); // 출력: [29, 6]
    }
}

설명

  1. 공통 분모 계산: 두 분수의 분모를 곱하여 공통 분모를 계산합니다.
  2. 분자 합산: 첫 번째 분수의 분자는 두 번째 분수의 분모를 곱하고, 두 번째 분수의 분자는 첫 번째 분수의 분모를 곱하여 두 분수의 분자를 더합니다.
  3. 최대공약수(GCD) 계산: gcd 메서드를 사용하여 두 수의 최대공약수를 계산합니다. 이 메서드는 유클리드 알고리즘을 사용하여 재귀적으로 GCD를 구합니다.
  4. 기약 분수로 변환: 계산된 GCD로 분자와 분모를 나누어 기약 분수로 변환합니다.
  5. 결과 반환: 기약 분수의 분자와 분모를 배열로 반환합니다.

중요코드

  • 두 분수의 합을 구하는 부분:
    • 두 분수의 공통 분모를 구하기 위해 첫 번째 분수의 분모와 두 번째 분수의 분모를 곱합니다.
    • 각 분수의 분자를 공통 분모에 맞추기 위해 첫 번째 분수의 분자는 두 번째 분수의 분모를 곱하고, 두 번째 분수의 분자는 첫 번째 분수의 분모를 곱합니다.
    • 이렇게 변환된 두 분수의 분자를 더하여 두 분수의 합을 구합니다.
  • 기약 분수로 변환하는 부분:
    • 구한 분자와 분모의 최대공약수를 유클리드 알고리즘을 사용하여 계산합니다.
    • 계산된 최대공약수로 분자와 분모를 나누어 기약 분수로 변환합니다.

실행결과

정확성 테스트
테스트 1 통과 (0.02ms, 83.5MB)
테스트 2 통과 (0.02ms, 78.3MB)
테스트 3 통과 (0.02ms, 76.6MB)
테스트 4 통과 (0.03ms, 75.4MB)
테스트 5 통과 (0.02ms, 77.8MB)
테스트 6 통과 (0.01ms, 86.7MB)
테스트 7 통과 (0.03ms, 72.8MB)
테스트 8 통과 (0.02ms, 77.3MB)
테스트 9 통과 (0.02ms, 77.8MB)
테스트 10 통과 (0.02ms, 71.9MB)
테스트 11 통과 (0.02ms, 71.6MB)
테스트 12 통과 (0.02ms, 72.5MB)
테스트 13 통과 (0.03ms, 81.7MB)
테스트 14 통과 (0.02ms, 73.6MB)
테스트 15 통과 (0.02ms, 71MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0