두 수(또는 여러 수)가 공통으로 가지는 배수 중 가장 작은 양의 정수입니다.
예를 들어 12와 18의 공통 배수는 36, 72, 108... 이고, 그 중 가장 작은 공통 배수는 36입니다.
LCM을 지지하는 수학: 약수, 배수, 소인수분해, GCD
유클리드 호제법: GCD를 O(log n)에 구하는 표준
Java로 LCM 구현하기: 안전한 계산 순서가 핵심
public class LcmGuide {
// 유클리드 호제법 (반복문): O(log(min(a,b)))
static long gcd(long a, long b) {
a = Math.abs(a);
b = Math.abs(b);
while (b != 0) {
long r = a % b;
a = b;
b = r;
}
return a;
}
// LCM: lcm(a, b) = |a / gcd(a,b) * b|
static long lcm(long a, long b) {
// 코테/실무에서 흔히: LCM(0, x) = 0 (문제 정의 우선)
if (a == 0 || b == 0) return 0;
long g = gcd(a, b);
return Math.abs((a / g) * b); // 나눗셈 먼저 -> 중간값 폭증/overflow 위험 감소
}
// 여러 수의 LCM (누적): LCM(a,b,c)=LCM(LCM(a,b),c)
static long lcmAll(long[] nums) {
long ans = 1;
for (long x : nums) {
ans = lcm(ans, x);
if (ans == 0) return 0;
}
return ans;
}
public static void main(String[] args) {
System.out.println(lcm(12, 18)); // 36
System.out.println(lcmAll(new long[]{2, 6, 8})); // 24
System.out.println(lcm(0, 10)); // 0
}
}
곱셈 전에 나눗셈을 해서 중간값이 과도하게 커지는 걸 줄입니다.
a*b가 먼저 overflow면 결과가 즉시 깨집니다.
LCM(12, 18)을 수학 → 알고리즘으로 검증하기
LCM(12,18)=|12×18|/6=36
자주 틀리는 지점 (실수 방지 체크)
체크리스트로 마무리