728x90
728x90
1. 문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
2. 제한사항
0 <denum1, num1, denum2, num2 < 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
'코딩테스트(Level 0~1)' 카테고리의 다른 글
[JAVA, Programmers] 푸드 파이트 대회(자바) (1) | 2022.12.08 |
---|---|
[JAVA, Programmers] 콜라 문제(자바) (0) | 2022.12.08 |
[JAVA, Programmers] 소수 찾기(자바) (0) | 2022.12.03 |
[JAVA, Programmers] 폰켓몬(자바) (0) | 2022.12.03 |
[JAVA, Programmers] 2016년(자바) (0) | 2022.12.03 |