이럴 때 써요
- 두 수의 최대공약수(GCD)나 최소공배수(LCM)가 필요할 때
- 분수를 기약분수로 줄일 때 — 분자·분모를 GCD로 나눠요
- 여러 신호의 공통 주기, 톱니바퀴가 다시 맞물리는 순간처럼 공통 배수를 구할 때
개념
최대공약수는 유클리드 호제법으로 순식간에 구해요. 핵심은
gcd(a, b) = gcd(b, a % b) — 큰 수를 작은 수로 나눈 나머지로 바꿔 가는 거예요. 나머지가 0이 되는 순간의 나눈 수가 답이에요. 한 단계마다 수가 확 줄어서 O(log(min(a, b)))예요.최소공배수는 GCD만 있으면 바로 나와요."gcd(48, 36)" — 나머지가 0이 되면 멈춰요gcd(48, 36) 을 나머지로 좁혀 가요gcd(48, 36) : 48 % 36 = 12 → gcd(36, 12)gcd(36, 12) : 36 % 12 = 0 → gcd(12, 0)gcd(12, 0) : b 가 0 → 답은 12→ 최대공약수 12
lcm(a, b) = a * b / gcd(a, b) 예요. 두 수의 곱에서 겹치는 부분(GCD)을 한 번 나눠 주는 거예요.수가 셋 이상이면 누적하면 돼요.
lcm(lcm(a, b), c) 처럼 왼쪽부터 접어 나가요. GCD도 똑같이 누적돼요.패턴 코드
유클리드 호제법으로 GCD·LCM반복문 버전이에요. 재귀로는
return b === 0 ? a : gcd(b, a % b) 한 줄로도 써요.javascriptCopy codefunction gcd(a, b) {while (b !== 0) {[a, b] = [b, a % b];}return a;}function lcm(a, b) {return (a / gcd(a, b)) * b;}