[Java] 최대공약수 (유클리드 호제법)

2022. 11. 9. 17:12Java

반응형

아래의 예제는 [프로그래머스 - 분수의 덧셈] 입니다.

더보기

첫 번째 분수의 분자와 분모를 뜻하는 denum1num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

최대공약수

정의)

공약수(두 개 이상의 자연수의 약수 중에서 공통인 것) 중에서 가장 큰 수

class Solution {
    public int[] solution(int denum1, int num1, int denum2, int num2) {
        
        denum1 *= num2;
        denum2 *= num1;
        int[] answer = new int[]{denum1 + denum2, num1 * num2};
        int max = 1;
        
        for(int i = 1; i <= answer[0] && i <= answer[1]; i++) {
            if(answer[0] % i == 0 && answer[1] % i == 0) {
                max = i;
            }
        }
        answer[0] /= max;
        answer[1] /= max;
        
        return answer;
    }
}

 

유클리드 호제법

개념)

두 정수 ab최대공약수를 G(ab)라고 하자.
정수 abq, r (b ≠ 0)에 대하여 a = bq + r이면 G(ab) = G(br)가 성립한다.

 

특징)

  • 소인수 분해하지 않고 최대공약수를 구할 수 있다.
  • 큰 수들의 최대공약수를 구할 때 유용하게 사용할 수 있다.
class Solution {
    public int GCD(int num1, int num2) {
        if (num1 % num2 == 0) {
            return num2;
        }
        return GCD(num2, num1 % num2);
    }
    
    public int[] solution(int denum1, int num1, int denum2, int num2) {
        
        denum1 *= num2;
        denum2 *= num1;
        int[] answer = new int[]{denum1 + denum2, num1 * num2};
        int max = GCD(answer[0], answer[1]);
        
        answer[0] /= max;
        answer[1] /= max;
        
        return answer;
    }
}
반응형

'Java' 카테고리의 다른 글

[Java] length / length() / size()  (0) 2022.11.25
[Java] 배열 평균 구하기  (0) 2022.11.23
[Java] 배열 오름차순 정렬  (0) 2022.11.14
[Java] 삼항 연산자 (조건식 ? 참 : 거짓)  (0) 2022.11.08
[Java] 향상된 for 문  (0) 2022.11.07