Java/알고리즘 & 자료구조

[Java/알고리즘] 유클리드 호제법(Euclidean Algorithm) : 최대공약수, 최소공배수

adjh54 2023. 5. 9. 20:06
728x170

 
 

해당 글에서는 유클리드 호제법에 대해 이해하고 최대공약수와 최소공배수에서 이를 활용할 수 있는 방법에 대해 공유합니다.





 
 

1) 유클리드 호제법(Euclidean Algorithm)


💡 유클리드 호제법/알고리즘(Euclidean Algorithm)

- 두 수의 '최대공약수(GCD)'를 찾기 위한 알고리즘을 의미합니다.

- 큰 수를 작은 수로 나누어 떨어지게 한 뒤, 수를 반복적으로 수행하여 나머지 0이 될때까지 작동하는 방법을 의미합니다.이때 작은 수가 최대공약수입니다.

 
 

[ 더 알아보기 ]

💡 호제법이란?

- 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 의미합니다.

유클리드 호제법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란

ko.wikipedia.org

 
 

2) 최대공약수(GCD: Greatest Common Divisor) & 최소공배수(LCM: Least Common Multiple)


💡 최대공약수(GCD: Greatest Common Divisor)

- 두 수의 공통된 '약수 중에서 가장 큰 수'를 의미합니다.


💡 최소공배수(LCM: Least Common Multiple)

- 두 수의 공통된 '배수 중에서 가장 작은 수'를 의미합니다.

 
 

[ 더 알아보기 ]

💡 약수(Divisors)

- 어떤 수를 나누어 떨어지게 하는 수를 의미합니다.
- 예를 들어 10의 약수는 1, 2, 5, 10입니다.


💡 배수(Multiple)

- 배수는 어떤 수의 배를 이루는 수를 의미합니다.
- 예를 들어 24는 12의 배수이며 시간의 배수는 1시간의 2배인 2시간을 말합니다.

 
 

💡 결론적으로는 유클리드 알고리즘을 기반으로 최대공약수를 구하고 이를 기반으로 최소공배수를 구합니다.

 
 
 
 

3) 두 수의 최대공약수, 최소공배수 구현하기


 

1. 최대공약수(GCD) 구현 방법


💡 최대공약수(GCD) 구현 방법

- 유클리드 호제법 이용하여서 ‘최대공약수(GCD)’를 구하는 방식입니다.

💡 큰 수를 작은 수로 나눈 나머지를 반복적으로 수행하여 나머지가 0이 될 때까지 작동하여 최대공약수를 구하는 방식입니다.


 1.1. 재귀 방식으로 구현

💡 재귀 방식으로 구현

- b가 0이라면 a가 최대공약수가 되며, 그렇지 않으면 b와 a % b의 최대공약수를 구합니다.
- 이를 재귀적으로 반복하여 최대공약수를 구할 수 있습니다.
// 재귀 방식
public static int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

 

💡 [참고] 재귀함수에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.

[Java/알고리즘] 재귀 함수(Recursion Function) 이해하기

해당 글에서는 재귀함수에 대해 이해하며 다양한 예시와 재귀함수를 이용한 알고리즘을 기반으로 이해를 돕기 위해 작성한 글입니다. 1) 재귀함수(Recursion Function) 💡 재귀함수(Recursion Function)란?

adjh54.tistory.com

 
 

1.2. 반복문 방식으로 구현

 💡 반복문 방식으로 구현

- 먼저, b가 0이 될 때까지, a를 b로 나눈 나머지를 b에 대입하고, a와 b의 값을 교환합니다.
- 이를 반복하여 최대공약수를 구할 수 있습니다.
// 반복문 방식
public static int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

 
 
 

2. 최소공배수(LCM) 구현 방법


💡 최소공배수(LCM) 구현 방법

- 최대공약수의 함수를 기반으로 '최소공배수'를 구합니다.

- 해당 방식은 두 수 a와 b의 최소공배수를 구하는 함수입니다.
- 함수 내부에서는 a와 b의 최대 공약수를 이용하여 최소 공배수를 계산합니다.
- 최소 공배수는 두 수의 곱에 최대 공약수를 나눈 값과 같습니다.
public static int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

 
 
 

3. [참고] 약수와 배수를 구하는 방법


3.1. 약수 구하기

💡약수 구하기

- for 문을 통해 1부터 n까지 반복하며 n을 i로 나누어 나머지가 0인 경우, 즉 약수일 때마다 i를 출력합니다.
int n = 12; // 약수를 구할 수
for (int i = 1; i <= n; i++) {
    if (n % i == 0) {
        System.out.println(i);
    }
}

 
 

3.2. 배수 구하기

int n = 3; // 배수를 구할 수
for (int i = 1; i <= 10; i++) {
    System.out.println(n * i);
}

 
 
 

4) N수의 최대 공약수, 최소 공배수 구현하기


1. 최대 공약수(GCD) 구현


💡최대 공약수(GCD) 구현

- 해당 부분에서는 int[] arr 파라미터로 받은 배열을 순회하면서 배열에 있는 모든 수의 '최대공약수'를 구합니다.

1. result 변수를 배열의 첫 번째 값으로 초기화합니다.

2. 반복문을 통해 배열의 나머지 값들과 최대공약수를 구하여 result 변수에 저장합니다.

3. 최종적으로 result 변수에 저장된 값이 배열에 있는 모든 수의 최대공약수가 됩니다.
public static int gcd(int[] arr) {
    int result = arr[0];
    for (int i = 1; i < arr.length; i++) {
        result = gcd(result, arr[i]);
    }
    return result;
}

public static int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

 
 
 

2. 최소공배수(LCM) 구현


💡최소공배수(LCM) 구현

- 해당 부분에서는 int[] arr 파라미터로 받은 배열을 순회하면서 배열에 있는 모든 수의 '최소공배수'를 구합니다.

1. result 변수를 배열의 첫 번째 값으로 초기화합니다.

2. 반복문을 통해 배열의 나머지 값들과 최소공배수를 구하여 result 변수에 저장합니다.

3. 최종적으로 result 변수에 저장된 값이 배열에 있는 모든 수의 최소공배수가 됩니다.
public static int lcm(int[] arr) {
    int result = arr[0];
    for (int i = 1; i < arr.length; i++) {
        result = lcm(result, arr[i]);
    }
    return result;
}

public static int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

 
 
 

💡 [참고] 좀 더 다양한 알고리즘에 대해 알고 싶으시면 아래의 글을 참고하시면 도움이 됩니다.
분류주제링크
알고리즘 복잡도시간 복잡도, 공간 복잡도, 빅오 표기법https://adjh54.tistory.com/186
   
탐색 알고리즘선형탐색https://adjh54.tistory.com/193
탐색 알고리즘이진탐색https://adjh54.tistory.com/187
탐색 알고리즘완전탐색 : 기본구조https://adjh54.tistory.com/196
탐색 알고리즘완전탐색 : 종류https://adjh54.tistory.com/197
탐색 알고리즘완전탐색: 문제로 이해하기https://adjh54.tistory.com/227
탐색 알고리즘깊이 우선 탐색(DFS) / 너비 우선 탐색(BFS)https://adjh54.tistory.com/328
   
알고리즘 설계방법동적 계획법 알고리즘https://adjh54.tistory.com/201
알고리즘 설계방법그리디 알고리즘https://adjh54.tistory.com/212
알고리즘 설계방법분할정복 알고리즘https://adjh54.tistory.com/219
   
기타 알고리즘재귀 함수https://adjh54.tistory.com/194
기타 알고리즘피보나치 수열: 경우의 수https://adjh54.tistory.com/183
기타 알고리즘유클리드 호제법: 최대공약수, 최대공배수https://adjh54.tistory.com/179

 
 
 

5) 참고


💡 해당 문제에서 적용하고 확인해보았습니다.

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 
 
 
 

 
 
 
오늘도 감사합니다. 😀
 
 
 
 

그리드형