해당 문제를 다음과 같이 3단계로 나누어 해결하였습니다.
1) 분수의 덧셈을 위해서, 분모를 맞추고 그에 비례하여 분자를 조정한다.
2) 계산한 결과는 기약분수이며, 기본적으로 약분하여 분자와 분모는 서로소 관계가 되도록 한다.
3) 위의 과정을 통해 구한 결과값을 배열 안에 넣어 출력한다.
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
// 1) 분모를 맞추고 그에 비례하여 분자를 조정한다.
int denom = denom1 * denom2;
int numer = numer1 * denom2 + numer2 * denom1;
// 2)계산한 결과를 분자와 분모가 서로소 관계인 기약분수로 나타낸다.
int max = 1;
for(int i = 1; i <= denom && i <= numer; i++) {
if (denom % i == 0 && numer % i == 0){
max = i;
}
}
int result_numer = numer / max;
int result_denom = denom / max;
// 3) 구한 결과값을 배열 안에 넣어 출력한다.
int[] answer = new int[2];
answer[0] = result_numer;
answer[1] = result_denom;
return answer;
}
}
- 꼭 최소공배수로 맞출 필요는 없으므로 denom1 * denom2로 맞춘다.
- 그에 맞추어 첫번째 분수의 분자(numer1)에는 denom2를, 두번째 분수의 분자(numer2)에는 denom1을 곱한다.
int denom = denom1 * denom2;
int numer = numer1 * denom2 + numer2 * denom1;
- 즉, 계산한 결과의 분수에 대해서 분자 분모의 최대공약수로 약분해야 한다.
- 최대공약수는 (1)분자 분모의 공통 약수이자, 그 중 (2)최대값임을 이용하여 구한다.
int max = 1;
for(int i = 1; i <= denom && i <= numer; i++) {
if (denom % i == 0 && numer % i == 0){
max = i;
}
}
int result_numer = numer / max;
int result_denom = denom / max;
- 위의 과정을 통해 구한 결과(분자, 분모)를 답안 형식에 맞게 배열에 넣는다.
- 방법1) new 연산자로 배열 크기 지정하여 정의하고, 배열 안에 값 넣기
- 방법2) 중괄호{}에 값 넣고, 배열 객체 생성하기
// 방법1
int[] answer = new int[2];
answer[0] = result_numer;
answer[1] = result_denom;
return answer;
// 방법2
int[] answer = {result_numer, result_denom};
return answer;
[문제 출처] 프로그래머스 코딩테스트 입문 Day02 - 분수의 덧셈
https://school.programmers.co.kr/learn/courses/30/lessons/120808