일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- Application
- 배타락
- Spring
- 기술면접대비
- stream
- jpa
- 자바8
- DB
- 스트림
- 개발자면접
- http
- equals
- 백엔드면접
- hashcode
- 공유락
- 개발자기술면접
- 데이터베이스
- 운영체제
- 알고리즘
- lock
- 면접준비
- 백엔드
- 스프링
- java
- 네트워크
- 자바면접
- 기술면접
- 자바기술면접
- 객체지향언어
- 자바
Archives
- Today
- Total
IT인으로 살아남기
[알고리즘/Java] 최대공약수(GCD), 최소공배수(LMC) 함수 본문
728x90
Java에서 최대공약수(GCD) 및 최소공배수(LCM) 를 구하는 방법을 자세히 알아보자.
1. 최대공약수(GCD) 구하는 방법
🔹 유클리드 호제법 (Euclidean Algorithm)
최대공약수를 구하는 가장 효율적인 알고리즘 중 하나는 유클리드 호제법입니다.
📌 유클리드 호제법 개념
- 두 수 a와 b가 있을 때, a를 b로 나눈 나머지를 r이라고 하면,
GCD(a, b) = GCD(b, r) 와 같습니다. - 이 과정을 나머지가 0이 될 때까지 반복하면, 남은 수가 최대공약수입니다.
🔹 유클리드 호제법의 예제
예를 들어, **GCD(48, 18)**을 구하는 과정:
- 48 ÷ 18 = 2 ... 나머지 12
- 18 ÷ 12 = 1 ... 나머지 6
- 12 ÷ 6 = 2 ... 나머지 0
➡️ 따라서 GCD(48, 18) = 6.
🔹 Java 코드 (재귀 & 반복문 방식)
public class MathUtils {
// 1. 재귀 함수 사용 (Recursive)
public static int gcdRecursive(int a, int b) {
if (b == 0) return a;
return gcdRecursive(b, a % b);
}
// 2. 반복문 사용 (Iterative)
public static int gcdIterative(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
public static void main(String[] args) {
int a = 48, b = 18;
System.out.println("GCD (재귀): " + gcdRecursive(a, b)); // 출력: 6
System.out.println("GCD (반복문): " + gcdIterative(a, b)); // 출력: 6
}
}
2. 최소공배수(LCM) 구하는 방법
🔹 개념
최소공배수(LCM)는 두 수의 공통 배수 중 가장 작은 값입니다.
LCM을 구하는 공식은 다음과 같습니다.
🔹 Java 코드
public class MathUtils {
// 최대공약수(GCD) - 반복문 방식
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
// 최소공배수(LCM)
public static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
public static void main(String[] args) {
int a = 48, b = 18;
System.out.println("LCM: " + lcm(a, b)); // 출력: 144
}
}
3. 시간 복잡도 분석
- GCD (유클리드 호제법)
- 시간 복잡도: O(log min(a, b))
- 이유: 매 단계에서 나누기를 수행하며 값이 절반 이하로 줄어들기 때문.
- LCM
- GCD를 구하는 데 O(log min(a, b)) 걸리고, 곱셈과 나눗셈은 O(1) 이므로
LCM의 전체 시간 복잡도는 O(log min(a, b)).
- GCD를 구하는 데 O(log min(a, b)) 걸리고, 곱셈과 나눗셈은 O(1) 이므로
728x90
'Algorithm' 카테고리의 다른 글
[알고리즘/Java] DFS (Depth-First Search, 깊이 우선 탐색), BFS (Breadth-First Search, 너비 우선 탐색) (1) | 2025.02.01 |
---|---|
[알고리즘/프로그래머스] 크기가 작은 부분 문자열 (1) | 2025.02.01 |