첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1,
두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다.
두 분수를 더한 값을 기약 분수로 나타냈을 때
분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
그냥 수학문제로 생각하면 쉬운데
코드로 구현해보려니 갑자기 사고가 멈춘 기분이었다.
그래서 차근차근 생각해보기로..
1 분자
numer1
1 분모
denom1
2 분자
numer2
2 분모
denom2
두 분수의 합
= (numer1)(denom2)+(numer2)(denom1)/(denom1)(denom2)
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
// 결과값을 담을 배열의 길이(요소) 선언
int[] answer = new int[2];
// 분자와 분모를 순서대로 담을 배열
// ex) [첫번째 분수 1/2] [두번째 분수 3/4]
// 분자 (numer1)(denom2)+(numer2)(denom1) -- 8
answer[0] = numer1 * denom2 + numer2 * denom1;
// 분모 (denom1)(denom2) -- 10
answer[1] = denom1 * denom2;
// 약분할 수
// answer[0]--8, answer[1]--10
// Math.min(파라미터 1, 파라미터 2); 작은 값 리턴
// Math.max(파라미터 1, 파라미터 2); 큰 값 리턴
int min = Math.min(answer[0], answer[1]); //8
int max = 1; // 1은 초기화값
// 약분할 수 최대값 찾기(기약분수를 위함)
// 둘을 동시에 나눌 수 있는 최대 공약수 구하기
for(int i=1; i<=min; i++){
if(answer[0] % i == 0 && answer[1] % i == 0){
max = i; // i에 저장 -- 2
}
}
// 분수 약분
// a = a / max 할당 연산자
answer[0] /= max;
answer[1] /= max;
return answer;
}
}
알게 된 다른풀이들
class Solution {
public int[] solution(int denum1, int num1, int denum2, int num2) {
int mother = num1 * num2;
int son1 = num1 * denum2;
int son2 = num2 * denum1;
int totalSon = son1 + son2;
for(int i = mother; i >= 1; i--){
if(totalSon % i == 0 && mother % i == 0){
totalSon /= i;
mother /= i;
}
}
int[] answer = {totalSon, mother};
return answer;
}
}
유클리드 호제법 사용
유클리드 호제법
: 두 정수의 최대 공약수(GCD, Greatest Common Divisor)를 효율적으로 구하는 알고리즘
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
answer[0] = numer1 * denom2 + numer2 * denom1;
answer[1] = denom1 * denom2;
// 최대 공약수 구하기
int gcd = getGCD(answer[0], answer[1]);
// 기약분수로 약분하기
answer[0] /= gcd;
answer[1] /= gcd;
return answer;
}
// 최대 공약수를 구하는 메서드 (유클리드 호제법 사용)
public int getGCD(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
아직 체득이 안 돼서 계속 보고 적용해보면서 이해를 더 해봐야 될 거 같다.