<문제 제시>
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1,
두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다.
두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을
return 하도록 solution 함수를 완성해보세요.
<예시 입출력>
<문제 해결 과정>
Try 1)
- 주어진 테스트케이스 2개는 통과했으나 제출 시 나머지 테스트는 통과하지 못하였다.
- 너무 표면적인 문제만 해결하려 했던 것 같다. >> 테스트케이스에 맞춰 코드를 설계하려 했음
int[] answer = {0, 0};
int temp;
// 공통 분모
int marking;
// Case 1. 첫번째 분수의 분모가 두번째 분수의 분모보다 클때
if(num1 > num2){
if(num1 % num2 != 0) {
marking = num1 * num2;
temp = marking / num1;
denum1 *= temp;
temp = marking / num2;
denum2 *= temp;
answer[1] = marking;
}
else {
temp = num1 / num2;
denum2 *= temp;
answer[1] = num1;
}
answer[0] = denum1 + denum2;
}
// Case 2. Case1의 반대일때
else if(num1 < num2){ // 9/2 , 1/3 일때
if(num2 % num1 != 0) {
marking = num1 * num2; // marking = 6
temp = marking / num1; //
denum1 *= temp;
temp = marking / num2;
denum2 *= temp;
answer[1] = marking;
}
else {
temp = num2 / num1;
denum1 *= temp;
answer[1] = num2;
}
answer[0] = denum1 + denum2;
}
// Case 3. 분모가 이미 같을때
else{
answer[0] = denum1 + denum2;
answer[1] = num1;
}
return answer;
Solution 1) 최대공약수를 활용하여 분모를 같은 크기로 맞추고, 분자도 그에 맞게 맞추기로하였다.
>> 그러기위해선 분모와 분자를 곱하는데, 대각선으로 곱해주어야한다. (denum1 * num2), (denum2 * num1)
answer[0] = (denum1 * num2) + (denum2 * num1);
answer[1] = num1 * num2;
또한 최대공약수를 구하기 위해 answer[0]와 answer[1]의 값을 비교하여 min에 넣고, min까지 반복하면서
최대공약수를 찾았다 (max)
구했던 answer[0]과 answer[1]을 각 max(최대공약수)로 나눠서(약분), 값을 구할 수 있었다.
<전체코드>
import java.util.Arrays;
public class fraction_addition {
public static int[] solution(int denum1, int num1, int denum2, int num2) {
int[] answer = new int [2];
answer[0] = (denum1 * num2) + (denum2 * num1);
answer[1] = num1 * num2;
// 두 개의 인자 중 작은 값을 리턴하여 min에 저장
int min = Math.min(answer[0], answer[1]);
int max = 1;
for(int i = 1; i <= min; i++) {
if(answer[0] % i == 0 && answer[1] % i == 0) {
max = i; // i로 분자 분모 모두 나누어 떨어지는 수가 '최대 공약수'
// 즉 max 는 최대공약수
}
}
// 최대 공약수로 모두 약분
answer[0] /= max;
answer[1] /= max;
return answer;
}
public static void main(String[] args) {
int denum1 = 1;
int num1 = 2;
int denum2 = 3;
int num2 = 4;
System.out.println(Arrays.toString(solution(denum1, num1, denum2, num2)));
}
}
수학적으로 구하는 방법으로는 쉬우나, 코드로 구현하려고 하니 복잡해지기도 하였다. 최대공약수를 활용하는 방법과 분모를 맞춰주는 방법 등을 알게 되었던 문제였다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120808
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '최빈값 구하기' - Java (0) | 2023.02.24 |
---|---|
[프로그래머스] '양꼬치' - Java (0) | 2023.02.23 |
[프로그래머스] '문자열 뒤집기' - Java (0) | 2023.02.22 |
[프로그래머스] '직각삼각형 출력하기' - Java (0) | 2023.02.22 |
[프로그래머스] '피자 나눠 먹기 (3)' - Java (0) | 2022.12.20 |