Codestates/Java
자바 유클리드 호제법으로 최대공약수 구하기
진태양
2022. 11. 28. 23:53
오늘 수업 때 나온 연습문제 중에서 최대공약수를 구해야 풀 수 있는 문제가 있었다.
최대공약수 자체는 중학생 수준의 문제였는데, 최대공약수를 구하는 로직이 신기해서 기록해두려고 한다.
유클리드 호제법에 대한 설명은 위키백과에서 긁어 오겠다.
호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
문제
두 수를 입력받아 최대공약수를 구한다.
입력
인자 1: num1
int 타입의 정수
인자 2: num2
int 타입의 정수
출력
int 타입의 정수
입출력 예시
int output = gcd(4, 8);
system.out.println(output); // --> 4
이번 문제는 내가 풀었다고 할만한 것도 없으니, 코드의 흐름을 보면서 기록하겠다.
public class GreatCommonDivisionExample {
public int gcd(int num1, int num2){ // num1 -> 4, num2 -> 8
if(num1 % num2 == 0) return num2; // 4 % 8 == 4
return gcd(num2, num1 % num2); // gcd(8, 4)
}
}
입출력 예시대로 num1에 4, num2에 8이 할당되면 if문은 참이 아니므로 if문 아래에 있는 리턴문이 실행되고 재귀 호출을 하게 된다.
이때 재귀호출에서의 인자의 값은 큰 값이 num1에 할당되고 작은 값이 num2에 할당되게 바뀐다. 대단하다.
public class GreatCommonDivisionExample {
public int gcd(int num1, int num2){ // num1 -> 8, num2 -> 4
if(num1 % num2 == 0) return num2; // 8 % 4 == 0 --> return 4
return gcd(num2, num1 % num2);
}
}
재귀 호출되었을 때 num1에 8, num2에는 4가 할당된다. 그러면 if문은 참이므로 num2의 값인 4가 반환된다.
그러면 입출력 예시처럼
int output = gcd(4, 8);
system.out.println(output); // --> 4
gcd(4, 8)의 값을 출력했을 때 4가 출력될 것이다.
이번 포스팅에서는 별거 없지만 신기해서 기록해봤는데 다음에는 좀 어려웠던 문제를 올려야겠다.
슨배임들 조언 환영합니다.