두 분수 numer1 / denom1과 numer2 / denom2가 주어질 때, 두 분수를 더한 값을 기약분수로 만들어 반환하는 문제이다.
두 분수를 통분하면,
int numer = numer1 * denom2 + numer2 * denom1;
int denom = denom1 * denom2;
가 된다.
분자 = numer1 × denom2 + numer2 × denom1
분모 = denom1 × denom2
for (int i = 1; i <= denom && i <= numer; i++) {
if (numer % i == 0 && denom % i == 0) {
max = i;
}
}
numer와 denom을 모두 나눌 수 있는 숫자를 찾고, 가장 큰 값을 max에 저장한다.
i가 증가하면서 조건을 만족할 때마다 max를 갱신하기 때문에 마지막에 저장된 값이 최대공약수가 된다.
numer = numer / max;
denom = denom / max;
분자와 분모를 최대공약수로 나누어 기약분수로 만든다.
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = {};
int max = 0;
// 두 분수를 통분하여 더한다
int numer = numer1 * denom2 + numer2 * denom1;
int denom = denom1 * denom2;
// 분자와 분모의 최대공약수 구하기
for (int i = 1; i <= denom && i <= numer; i++) {
if (numer % i == 0 && denom % i == 0) {
max = i;
}
}
// 최대공약수로 약분
numer = numer / max;
denom = denom / max;
answer = new int[]{numer, denom};
return answer;
}
}
