πŸ–₯ CS/Algorithm

[Algorithm/Swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€(Lv.1) - μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

janechoi 2022. 12. 6. 00:14

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€!!

μ˜€λŠ˜μ€ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제λ₯Ό ν’€λ‹€κ°€ μ•Œκ²Œλœ μ΅œλŒ€κ³΅μ•½μˆ˜, μ΅œμ†Œκ³΅λ°°μˆ˜ κ΅¬ν•˜λŠ” 방법에 λŒ€ν•΄ 기둝해보렀고 ν•©λ‹ˆλ‹€!

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜ λ¬Έμ œλŠ” 레벨1의 κ°„λ‹¨ν•œ λ¬Έμ œμ΄μ§€λ§Œ

μ΅œλŒ€κ³΅μ•½μˆ˜, μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” 곡식(?)κ³Ό 같은 κ°œλ…μ„ μ•Œκ³ μžˆμ§€ μ•Šλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μ—†λŠ” 문제이기 λ•Œλ¬Έμ— λ‹€λ₯Έ λ¬Έμ œλ“€μ—μ„œμ˜ μ‘μš©μ— λŒ€λΉ„ν•΄ μ •λ¦¬ν•˜κ³  λ„˜μ–΄κ°€λ €κ³  ν•©λ‹ˆλ‹€!!

문제 링크

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

문제 μ„€λͺ…

두 수λ₯Ό μž…λ ₯λ°›μ•„ 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 μ™„μ„±ν•΄ λ³΄μ„Έμš”. λ°°μ—΄μ˜ 맨 μ•žμ— μ΅œλŒ€κ³΅μ•½μˆ˜, κ·Έλ‹€μŒ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό λ„£μ–΄ λ°˜ν™˜ν•˜λ©΄ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 두 수 3, 12의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 3, μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” 12μ΄λ―€λ‘œ solution(3, 12)λŠ” [3, 12]λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ œν•œ 사항

  • 두 μˆ˜λŠ” 1이상 1000000μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

 n  m  return
 3  12  [3, 12]
 2  5  [1, 10]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
μœ„μ˜ μ„€λͺ…κ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2
μžμ—°μˆ˜ 2와 5의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 1, μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” 10μ΄λ―€λ‘œ [1, 10]을 리턴해야 ν•©λ‹ˆλ‹€.

문제 풀이

μ•½μˆ˜, 배수 κ΅¬ν•˜κΈ°λŠ” λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œλ‘œλ„ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„μ΄ 되기 λ•Œλ¬Έμ— 이 λ¬Έμ œλ„ μ‰½κ²Œ ν’€ 수 μžˆμ„ 것이라고 μƒκ°ν–ˆλŠ”λ°,

막상 λ‘ 수의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•˜λ‹ˆ 어라라.. μ½”λ“œκ°€ μ—„μ²­ λ³΅μž‘ν•΄μ§€κ³ ..

λ­”κ°€ 문제의 μ˜λ„λŠ” 이게 μ•„λ‹Œ 것 κ°™κ³ ..ν•΄μ„œ 풀이λ₯Ό μ°Ύμ•„λ³΄κ²Œ λ˜μ—ˆλ‹€.

 

λ¨Όμ €, μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ„ μ΄μš©ν•΄ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ„ κ°„λ‹¨νžˆ μ •λ¦¬ν•΄λ³΄μžλ©΄, λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

2개의 μžμ—°μˆ˜(λ˜λŠ” 정식) a, b에 λŒ€ν•΄μ„œ aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό r이라 ν•˜λ©΄ (단, a>b),
a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” b와 r의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ κ°™λ‹€.

 

이 μ„±μ§ˆμ— 따라, bλ₯Ό r둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ r'을 κ΅¬ν•˜κ³ , λ‹€μ‹œ r을 r'둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ” 과정을 λ°˜λ³΅ν•˜μ—¬

λ‚˜λ¨Έμ§€κ°€ 0이 λ˜μ—ˆμ„ λ•Œ λ‚˜λˆ„λŠ” μˆ˜κ°€ a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜μž…λ‹ˆλ‹€!

이λ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄, aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ 값이 0일 λ•ŒκΉŒμ§€ λ°˜λ³΅λ˜λŠ” μž¬κ·€ν•¨μˆ˜ ν˜•νƒœλ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

/// μ΅œλŒ€κ³΅μ•½μˆ˜
func gcd(_ a: Int, _ b: Int) -> Int {
    if b == 0 {
        return a
    } else {
        return gcd(b, a % b)
    }
}

 

μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν–ˆλ‹€λ©΄ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μ˜ 관계λ₯Ό μ΄μš©ν•΄ μ‰½κ²Œ ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€!

μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μ˜ κ΄€κ³„λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

두 μžμ—°μˆ˜ A, B의 μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ G이고, μ΅œμ†Œκ³΅λ°°μˆ˜κ°€ L일 λ•Œ,
A = a x G, B = b x G (a, bλŠ” μ„œλ‘œμ†Œ) λΌ ν•˜λ©΄ λ‹€μŒμ΄ μ„±λ¦½ν•œλ‹€.
1) L = a x b x G
2) A x B = L x G

 

즉, 두 수λ₯Ό κ³±ν•œ 값은 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜ x μ΅œμ†Œκ³΅λ°°μˆ˜ 와 κ°™μŠ΅λ‹ˆλ‹€!

a*b = μ΅œλŒ€κ³΅μ•½μˆ˜ * μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό ν™œμš©ν•΄ μ½”λ“œλ‘œ κ΅¬ν˜„ν•΄λ³΄λ©΄ μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

/// μ΅œμ†Œκ³΅λ°°μˆ˜
func lcm(_ a: Int, _ b: Int) -> Int {
    return a * b / gcd(a, b)
}

전체 μ½”λ“œ

/// μ΅œλŒ€κ³΅μ•½μˆ˜
func gcd(_ a: Int, _ b: Int) -> Int {
    if b == 0 {
        return a
    } else {
        return gcd(b, a % b)
    }
}

/// μ΅œμ†Œκ³΅λ°°μˆ˜
func lcm(_ a: Int, _ b: Int) -> Int {
    return a * b / gcd(a, b)
}

func solution(_ n:Int, _ m:Int) -> [Int] {
    return [gcd(n, m), lcm(n, m)]
}

 


 

[참고 자료]

https://ko.wikipedia.org/wiki/μœ ν΄λ¦¬λ“œ_ν˜Έμ œλ²•

https://hongjeongseob82.medium.com/ios-swift-gcd-lgm-μ΅œλŒ€κ³΅μ•½μˆ˜-μ΅œμ†Œκ³΅λ°°μˆ˜-49d57a36fda3

https://velog.io/@2dubu/Swift-μ•Œκ³ λ¦¬μ¦˜-μ΅œλŒ€κ³΅μ•½μˆ˜μ™€-μ΅œμ†Œκ³΅λ°°μˆ˜