πŸ“™

GCD / LCM

μš©μ–΄ μ•Œκ³ κ°€κΈ°

β€’
μ•½μˆ˜ : μ–΄λ–€ 수λ₯Ό λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ ν•˜λŠ” 수
β€’
배수 : μ–΄λ–€ 수의 1, 2, 3, ...n λ°°ν•˜μ—¬ μ–»λŠ” 수
β€’
κ³΅μ•½μˆ˜ : λ‘˜ μ΄μƒμ˜ 수의 곡톡 μ•½μˆ˜
β€’
곡배수 : λ‘˜ μ΄μƒμ˜ 수의 곡톡 배수
β€’
μ΅œλŒ€ κ³΅μ•½μˆ˜ : λ‘˜ μ΄μƒμ˜ κ³΅μ•½μˆ˜ 쀑 μ΅œλŒ€μΈ 수
β€’
μ΅œμ†Œ 곡배수 : λ‘˜ μ΄μƒμ˜ 곡배수 쀑 μ΅œμ†ŒμΈ 수

μ•½μˆ˜ κ΅¬ν•˜κΈ°

n의 μ•½μˆ˜λ₯Ό κ΅¬ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ?
μ‰½κ²Œ 생각해본닀면 n을 1λΆ€ν„° nκΉŒμ§€μ˜ 수둜 ν•œλ²ˆμ”© λ‚˜λˆ μ„œ 확인해볼 수 μžˆλ‹€.
function getDivisor(n) { const result = []; for (let i = 1; i < n; i++) { if (n % i === 0) result.append(i); } return result; }
JavaScript
볡사
μœ„μ™€ 같은 방법도 μžˆμ§€λ§Œ 더 효율적으둜 κ΅¬ν•˜λŠ” 방법을 μƒκ°ν•΄λ³΄μž
μž„μ˜μ˜ μžμ—°μˆ˜ N의 μ•½μˆ˜λ“€ μ€‘μ—μ„œ 두 μ•½μˆ˜μ˜ 곱이 N이 λ˜λŠ” μ•½μˆ˜ A와 μ•½μˆ˜ BλŠ” λ°˜λ“œμ‹œ μ‘΄μž¬ν•œλ‹€
β‡’ μžμ—°μˆ˜ N의 μ œκ³±κ·ΌκΉŒμ§€μ˜ μ•½μˆ˜λ₯Ό κ΅¬ν•˜λ©΄ κ·Έ 짝이 λ˜λŠ” μ•½μˆ˜λŠ” μžλ™μœΌλ‘œ ꡬ해진닀.
function getDivisor(n) { const result = []; const resultBack = []; for (let i = 1; i < n ** (1 / 2); i++) { if (n % i === 0) { result.push(i); if (i * i !== n) result.unshift(n / i); } } return result.concat(resultBack); }
JavaScript
볡사
μœ„ μ½”λ“œλŠ” O(n\sqrt{n})의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό 가짐

GCD μ΅œλŒ€ κ³΅μ•½μˆ˜

Greatest Common Divisor
λ‘˜ μ΄μƒμ˜ κ³΅μ•½μˆ˜ 쀑, μ΅œλŒ€μΈ 수

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•

aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό r이라고 ν•œλ‹€λ©΄
a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ b와 r의 μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ κ°™κ³  r이 0일 λ•Œμ˜ bκ°€ μ΅œλŒ€κ³΅μ•½μˆ˜μ΄λ‹€.
GCD(a, b) = GCD(b, a % b)
λ”°λΌμ„œ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
let getGCD = (a, b) => (b > 0 ? getGCD(b, a % b) : a);
JavaScript
볡사
a < b 이더라도 getGCB(a, a % b = a) μ΄λ―€λ‘œ μžλ™ μŠ€μ™‘λœλ‹€.

LCM μ΅œμ†Œ 곡배수

Least Common Multiple
λ‘˜ μ΄μƒμ˜ 곡배수 쀑, μ΅œμ†ŒμΈ 수
μ΅œμ†Œ κ³΅λ°°μˆ˜λŠ” μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ ꡬ할 수 μžˆλ‹€.
a * b = gcd(a, b) * lcm(a, b) μ΄λ―€λ‘œ
β‡’ lcm(a, b) = (a * b) / gcd(a, b)
let getGCD = (a, b) => (b > 0 ? getGCD(b, a % b) : a); let getLCM = (a, b, gcd) => (a * b) / gcd; const solution = (a, b) => { let gcd = getGCD(a, b); return getLCM(a, b, gcd); }
JavaScript
볡사