728x170
해당 글에서는 유클리드 호제법에 대해 이해하고 최대공약수와 최소공배수에서 이를 활용할 수 있는 방법에 대해 공유합니다.
1) 유클리드 호제법(Euclidean Algorithm)
💡 유클리드 호제법/알고리즘(Euclidean Algorithm)
- 두 수의 '최대공약수(GCD)'를 찾기 위한 알고리즘을 의미합니다.
- 큰 수를 작은 수로 나누어 떨어지게 한 뒤, 수를 반복적으로 수행하여 나머지 0이 될때까지 작동하는 방법을 의미합니다.이때 작은 수가 최대공약수입니다.
[ 더 알아보기 ]
💡 호제법이란?
- 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 의미합니다.
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);
}
💡 [참고] 재귀함수에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
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) 참고
💡 해당 문제에서 적용하고 확인해보았습니다.
오늘도 감사합니다. 😀
그리드형
'Java > 알고리즘 & 자료구조' 카테고리의 다른 글
[Java/알고리즘] 이진 탐색(Binary Search) 이해하기 (2) | 2023.05.22 |
---|---|
[Java/알고리즘] 시간 복잡도, 공간 복잡도, 빅오 표기법 이해하기 (1) | 2023.05.22 |
[Java/자료구조] 선형구조 - 스택(Stack), 큐(Queue) 이해하기 -2 : 문제로 이해하기 (0) | 2023.05.13 |
[Java/알고리즘] 피보나치 수열(Fibonacci numbers) : 경우의 수 (2) | 2023.05.11 |
[Java/자료구조] 선형구조 - 큐(Queue), 스택(Stack), 덱(Deque) 이해하기 - 1 (4) | 2023.03.04 |