유클리드 호제법(Euclidean algorithm)

2024. 4. 5. 16:20· 알고리즘/자료구조
목차
  1. 최대공약수(GCD) & 최소공배수(LCM)
  2. 최대공약수(GCD)  구현 방식
  3. 1. 재귀 함수(Recursive Function)
  4. 2. 반복문(Loop)
  5. 최소공배수(LCM) 구현 방식

유클리드 호제법은 두 개의 자연수의 최대공약수(GCD, Greatest Common Divisor)를 구하는 알고리즘입니다. 유클리드 호제법을 통해 최대공약수와 함께 최소공배수를 구할 수 있으며, 이를 활용하는 방법에 대해 정리하려고 합니다.

 

최대공약수(GCD) & 최소공배수(LCM)


유클리드 호제법을 말하기 전에 최대공약수와 최소공배수의 개념을 간단하게 설명해 보겠습니다.

 

최대공약수(GCD, Greatest Common Divisor)

  • 두 개 이상의 수가 가지는 공통된 약수 중 가장 큰 수를 의미합니다.
  • 예를 들어, 12와 18의 최대공약수는 6입니다. 12와 18의 공약수는 1, 2, 3, 6이며, 이 중 가장 약수가 6이기 때문입니다.

 

최소공배수(LCM, Least Common Multiple)

  • 두 개 이상의 수가 모두 공통으로 갖는 배수 중에서 가장 작은 수를 의미합니다.
  • 예를 들어, 4와 6의 최소공배수는 12입니다. 4와 6의 배수는 각각 4, 8, 12, ... 와 6, 12, 18, ...이며, 이중 가장 작은 공통 배수는 12이기 때문입니다.
  • 두 수를 알고, 최대공약수를 안다면 최소공배수를 구할 수 있습니다. (두 수가 a, b일 때 a * b / GCD(a, b) = LCM)

 

최대공약수(GCD)  구현 방식


유클리드 호제법은 두 개의 자연수의 최대공약수를 구하는 간단하면서도 효율적인 알고리즘입니다.

  1. 두 자연수를 a, b로 가정합니다.
  2. a와 b를 나눈 나머지를 구합니다. (a % b)
  3. 만약 나머지가 0이면, b가 최대 공약수입니다. 즉, GCD(a, b) = b가 성립합니다.
  4. 나머지가 0이 아니라면, 나머지를 b, 이전의 b를 a로 하여 2번째로 돌아갑니다.
  5. 나머지가 0이 될 때까지 위 과정을 반복합니다.

이 과정을 통해 나머지가 0이 되는 순간 b값이 두 자연수 a와 b의 최대공약수가 됩니다.

이를 통해 최대공약수(GCD)를 구현하면 다음과 같습니다.

 

1. 재귀 함수(Recursive Function)


            
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
더보기
💡 재귀 함수(Recursive Function)란?
함수 자기 자신을 호출하는 것을 허용하는 함수입니다. 이는 함수가 어떤 작업을 수행하기 위해 자기 자신을 다시 호출할 수 있으며, 보통 재귀 호출을 통해 작은 문제를 해결하고, 이를 조합하여 더 큰 문제를 해결하는 데 사용됩니다.

재귀 함수는 보통 기저 조건(base case)과 재귀 호출(recursive call)로 이루어져 있습니다. 기조 조건은 함수가 자기 자신을 호출하지 않고 바로 반환하는 경우로, 재귀를 종료시키는 역할을 합니다. 재귀 호출은 함수가 자기 자신을 호출하여 더 작은 입력 값에 대해 작업을 수행하는 것을 의미합니다. 재귀 호출은 입력 값이 점점 작아지며 입력 값이 기저 조건에 부합될 때 종료됩니다.

 

2. 반복문(Loop)


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

 

 

최소공배수(LCM) 구현 방식


최소공배수를 구하는 방법은 최대공약수를 알고 있다면 쉽게 구할 수 있습니다. 두 수가 각각 a, b이고, 이들의 최대 공약수를 gcd(a, b)로 표기한다면, 두 수의 최소 공배수는 a와 b를 곱한 결과를 최대공약수로 나누어주면 됩니다. 즉, 다음과 같은 공식을 사용합니다.

두 수의 최소공배수는 두 수의 곱에 두 수의 최대공약수를 나누어줌으로써 구할 수 있습니다. 예를 들어 두 수가 12와 8일 경우, 이들의 최대공약수는 6입니다. 이를 이용하여 최소공배수를 구한다면 다음과 같습니다.

따라서, 12와 18의 최소공배수는 36입니다.

이를 통해 최소공배수(LCM)를 구현하면 다음과 같습니다.


            
public static int lcm(int a, int b) {
return a * b / gcd(a, b);
}
public static int gcd(int a, int b) {
while (b != 0) {
int tmp = b;
b = a % b;
a = tmp;
}
return a;
}

 

'알고리즘 > 자료구조' 카테고리의 다른 글

우선순위 큐(Priority Queue)  (0) 2024.04.03
피보나치 수열(Fibonacci numbers)  (1) 2024.03.17
  1. 최대공약수(GCD) & 최소공배수(LCM)
  2. 최대공약수(GCD)  구현 방식
  3. 1. 재귀 함수(Recursive Function)
  4. 2. 반복문(Loop)
  5. 최소공배수(LCM) 구현 방식
'알고리즘/자료구조' 카테고리의 다른 글
  • 우선순위 큐(Priority Queue)
  • 피보나치 수열(Fibonacci numbers)
Hui._.
Hui._.
High hope
개발 일기High hope
Hui._.
개발 일기
Hui._.
전체
오늘
어제
  • 분류 전체보기 (57)
    • Java (4)
    • Spring (26)
      • Spring Framework (6)
      • Spring Security (9)
      • JPA (11)
    • CS (2)
    • 알고리즘 (19)
      • 문제풀이 (16)
      • 자료구조 (3)
    • ETC (3)
    • Project (3)
      • Trouble Shooting (3)

블로그 메뉴

  • 홈
  • 글쓰기
  • 설정

공지사항

인기 글

태그

  • 알고리즘
  • 분리
  • 회원 기능
  • 스프링 시큐리티6.1
  • SOLID
  • 엔티티
  • 유클리드
  • oauth
  • dynamic programming
  • 매핑
  • 인터페이스
  • 스프링 부트3
  • 프로그래머스
  • Spring Boot 3.2.3
  • jpa
  • 추상화
  • 코딩테스트
  • java
  • Oauth 2.0
  • 최소공배수
  • Spring Security
  • 원칙
  • jwt
  • 호제법
  • Spring Security + JWT + OAuth 2.0
  • persist
  • Spring Security 6.1
  • 지연
  • 최대공약수
  • HashMap

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hui._.
유클리드 호제법(Euclidean algorithm)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.