코딩테스트(Level 0~1)

[JAVA, Programmers] 분수의 덧셈(자바)

justdoIT0730 2022. 12. 4. 19:53
728x90
728x90

1. 문제 설명

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

 

2. 제한사항

0 <denum1num1denum2num2 < 1,000

 

3. 입출력

denum1 num1 denum2 num2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]

 

4. 입출력 설명

- 입출력 #1

1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4] return 합니다.

 

- 입출력 #2

9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6] return 합니다.

 

5. 풀이

class Solution {
    public int[] solution(int denum1, int num1, int denum2, int num2) {
       int[] answer = new int[2];
		int min = (num1<num2) ? num1:num2;
		
		int a =0;
		for(int i =1; i<=min; i++) {
			if(num1%i==0&&num2%i==0) {
				a =i;
			}
		}
		answer[1] = num1*num2/a; 
		answer[0] = denum1*(answer[1]/num1)+denum2*(answer[1]/num2);
		
		int b =0;
		int min2=(answer[0]<answer[1]) ? answer[0]:answer[1];
		for(int i=1; i<=min2; i++) {
			if(answer[0]%i==0&&answer[1]%i==0) {
				b=i;
			}
		}
		answer[0] /=b;
		answer[1] /=b;
        return answer;
    }
}

1. 분모의 최대공약수(a)를 구해 answer[1]에 저장한다.

2. a에서 분모를 나눈 값만큼 분자에 곱해 answer[0]에 저장한다.

3. 1과 2에서 구한 분수를 같은 방식으로 최대공약수를 구해 약분하여 분모와 분자를 각각 저장한다.

 

하지만 같은 방식을 반복하다 보니 매우 불편하였다,, 그냥 한번에 분수의 덧셈 문제를 해결할 수 있도록 접근해보자

 

6. 풀이(최종)

class Solution {
    public int[] solution(int denum1, int num1, int denum2, int num2) {
        int[] answer = new int[2];
        answer[0] = num1*denum2 + num2*denum1;
        answer[1] = num1*num2;
        
        int min = (answer[0]>answer[1]) ? answer[0]:answer[1];
        int a = 0;
        for (int i= 1; i<= min; i++) {
            if (answer[0]%i==0 && answer[1]%i== 0)
                a = i;
        }
        answer[0] = answer[0]/a;
        answer[1] = answer[1]/a;

        return answer;
    }
}

1. 각 분수의 분모와 분자를 각각 더한 값을 answer[0]에 담는다

2. 각 분수의 분모의 곱을 answer[1]에 담는다.

3. 5. 풀이 에서 처럼 answer[0]과 answer[1]의 최소공배수와 최대공약수를 구한다.

728x90
728x90