
✍️ 최대공약수와 유클리드 호제법
코딩 테스트에서 심심치 않게 등장하는 최대공약수 구하기
2부터 시작하는 반복문으로 구할 수 있지만 유클리드 호제법을 사용하면 보다 효율적으로 구할 수 있다.
유클리드 호제법의 과정은 다음과 같다.
1. 큰 수를 작은 수로 나눈다.
2. 나누는 수를 나머지로 계속 나눈다.
3. 나머지가 0이 나오면 나누는 수가 최대공약수이다.
1512와 1008의 최대공약수를 유클리드 호제법으로 풀어보면
1512=1008∗1+504
1008=504∗2+0
두 수의 최대공약수는 504이다.
💡 유클리드 호제법 이해하기
나는 원리를 알지 못한다면 금방 까먹는 사람으로서... 대충이라도 원리를 정리해 보려 한다.
(1) 어떤 수 A를 B로 나눈다면 다음과 같이 표현한다.
A=B∗Q+R
(2) 이때 A와 B의 최대공약수를 G라고 했을 때 A=a∗G B=b∗G로 나타낼 수 있고 위 식에 대입해 R에 대해 정리하면 다음과 같이 표현할 수 있다.
a∗G=b∗G∗Q+R
R=a∗G−b∗G∗Q
=G∗(a−b∗Q)
(3) 즉 나머지 R도 최대 공약수(G)를 갖고 있으니 B와 R의 최대 공약수가 곧 A와 B의 최대공약수를 구하는 것과 동일하다.
🍊 코드
[유클리드 호제법 반복문]
int gcd(int a, int b)
{
int c;
while(b)
{
c = a % b;
a = b;
b = c;
}
return a;
}
[유클리드 호제법 재귀 함수]
int gcd(int a, int b)
{
return b ? gcd(b, a%b) : a;
}
✏️ 관련 문제
코딩테스트 연습 - 최대공약수와 최소공배수
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의
programmers.co.kr
'Algorithm > 감명 깊게 본 코딩 팁' 카테고리의 다른 글
[코딩 팁] 변수의 최댓값 최솟값 제한하기 (0) | 2022.05.12 |
---|---|
[코딩 팁] 방향 배열(Direction Array) : 상하좌우 이동 (0) | 2021.10.03 |