728x90
최대공약수란?
최대공약수(GCD, Greatest Common Divisor)는 두 개 이상의 수의 공통된 약수 중에서 가장 큰 값을 말합니다.
약수란?
약수는 어떤 정수 n을 나누었을 때 나머지가 0이 되는 수를 의미합니다. 예를 들어, 10의 약수는 1, 2, 5, 10입니다. 이 숫자들은 모두 10을 나누었을 때 나머지가 0이 됩니다.
약수 구하기
public static void main(String[] args) {
int n = 10;
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
System.out.println(i);
}
}
}
위 코드는 1부터 n까지 반복문을 돌리면서 n을 i로 나누었을 때 나머지가 0인 숫자를 구하는 코드입니다.
n과 m의 공통된 약수 구하기
public static void main(String[] args) {
int n = 10;
int m = 15;
int minNum = Math.min(n, m);
for (int i = 1; i <= minNum; i++) {
if (n % i == 0 && m % i == 0) {
System.out.println(i);
}
}
}
// 출력 값
1
5
위 코드는 n과 m의 공통된 약수를 구하는 방법입니다.
여기서 Math.min(n, m)을 사용하여 더 작은 수까지 반복하는 이유 :
두 수의 공통 약수는 작은 수의 약수 중에만 존재할 수 있기 때문입니다. 따라서, 작은 수의 약수들만 검사하면 됩니다.
이 경우, 10과 15의 공통된 약수는 1과 5입니다. 따라서 최대공약수는 5입니다.
최대공약수만 구하기
public static void main(String[] args) {
int n = 10;
int m = 15;
int minNum = Math.min(n, m);
for (int i = minNum; i >= 1; i--) {
if (n % i == 0 && m % i == 0) {
System.out.println("최대공약수 : " + i);
break;
}
}
}
위 코드는 n과 m의 최대공약수를 구하는 방법입니다.
여기서 minNum부터 1까지 반복하면서 n과 m 모두 나누어떨어지는 첫 번째 숫자를 찾으면 그것이 최대공약수가 됩니다.
재귀함수로 최대공약수(GCD) 구하기
아직 재귀함수를 모르신다면 재귀함수를 공부하고 보시는 것을 추천합니다.
public static void main(String[] args) {
int n = 10;
int m = 15;
System.out.println(gcd(n,m));
}
public static int gcd(int n, int m) {
if (m == 0) {
return n;
}
return gcd(m, n % m);
}
코드 설명
- 기본 조건 확인: gcd 메소드에서는 먼저 m이 0인지 확인합니다. 만약 m이 0이라면 n을 반환합니다. 이것은 최대공약수가 n임을 의미합니다.
- 재귀 호출: m이 0이 아닌 경우, gcd 메소드를 재귀적으로 호출합니다. 이때 새로운 n은 이전의 m이 되고, 새로운 m은 n % m이 됩니다.
예시: 10과 15
- 초기 호출: gcd(10, 15)
- m이 0이 아니므로 gcd(15, 10)를 호출합니다.
- 첫 번째 재귀 호출: gcd(15, 10)
- m이 0이 아니므로 gcd(10, 5)를 호출합니다.
- 두 번째 재귀 호출: gcd(10, 5)
- m이 0이 아니므로 gcd(5, 0)을 호출합니다.
- 세 번째 재귀 호출: gcd(5, 0)
- m이 0이므로 n을 반환합니다. 여기서 n은 5입니다.
더 나은 방법: 유클리드 호제법
유클리드 호제법은 두 수의 최대공약수를 빠르게 구하는 알고리즘입니다. 이 방법은 큰 수를 작은 수로 나누고, 나머지가 0이 될 때까지 반복하는 방식입니다. 재귀함수를 응용한 코드 입니다.
public static void main(String[] args) {
int n = 10;
int m = 20;
System.out.println(gcd(n,m));
}
public static int gcd(int n, int m) {
while (m != 0) {
int tmp = n % m;
n = m;
m = tmp;
}
return n;
}
유클리드 호제법을 사용하면 반복문의 횟수를 줄여 더 효율적으로 최대공약수를 구할 수 있습니다.
정리
- 최대공약수(GCD)는 두 수의 공통된 약수 중 가장 큰 값입니다.
- 약수는 어떤 정수를 나누었을 때 나머지가 0이 되는 수입니다.
- 최대공약수는 반복문을 통해서도 구할 수 있지만, 재귀함수와 유클리드 호제법을 사용하면 더 효율적으로 구할 수 있습니다.
- 유클리드 호제법은 큰 수를 작은 수로 나누고, 나머지가 0이 될 때까지 반복하여 GCD를 구하는 방법입니다.
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 진법 변환 (Java) (0) | 2024.08.22 |
---|---|
[알고리즘] 동적계획법(Dynamic Programming : DP) (0) | 2024.08.20 |
[알고리즘] 소인수분해 (Java) (0) | 2024.08.17 |
[알고리즘] 효율적으로 소수를 구하는 방법 (Java 예제 포함) (0) | 2024.08.16 |
[알고리즘] 최소공배수 lcm (0) | 2024.07.28 |