πŸ‘‰μžλ£Œκ΅¬μ‘°/πŸ‘‰μ•Œκ³ λ¦¬μ¦˜ - 12

ν•™μŠ΅κΈ°λ‘

였늘 듀은 κ°•μ˜ λͺ©λ‘

  1. μž¬κ·€ - 2
  2. μž¬κ·€ - 3

μž¬κ·€ ν•¨μˆ˜

μž¬κ·€ ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€.

μž¬κ·€ν•¨μˆ˜ (리슀트의 ν•©)

μž¬κ·€1

list의 0번째 μš”μ†Œ + μŠ¬λΌμ΄μ‹±μ„ μ΄μš©ν•΄μ„œ list의 1번째 μš”μ†ŒλΆ€ν„° λ§ˆμ§€λ§‰ μš”μ†ŒκΉŒμ§€ 이루어진 리슀트 list[1:]λ₯Ό SumList에 λ„˜κΈ΄ 결과값을 μ΄μš©ν•΄μ„œ μž‘μ„±ν–ˆλ‹€.

list = [1,2,3,4,5,6]

def SumList(list):
    if len(list) > 1:
        return list[0] + SumList(list[1:])
    return list[0]
SumList(list)

μ‹œκ°„λ³΅μž‘λ„ : $O(n)$
κ³΅κ°„λ³΅μž‘λ„ : $O(n^2)$

μž¬κ·€ν•¨μˆ˜ (회문 νŒλ³„)

μž¬κ·€2

def IsPalindrome(str):
    if len(str) <= 1:
        return True
    return (str[0] == str[-1]) and IsPalindrome(str[1:-1])

μ‹œκ°„λ³΅μž‘λ„ : $O(n)$
κ³΅κ°„λ³΅μž‘λ„ : $O(n^2)$

μž¬κ·€ν•¨μˆ˜ (n을 1, 2, 3으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우의 수)

μž¬κ·€3

called = 0
def comb(n):
    print("comb : ", n)
    global called
    called += 1
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3:
        return 4
    return comb(n - 1) + comb(n - 2) + comb(n - 3)

n = 10
print(comb(n), " : ",called)

μ‹œκ°„λ³΅μž‘λ„ : μ•½ $O(2^n)$ (계산을 μ–΄λ–»κ²Œ 해야할지.. κ·Έλƒ₯ n에 λ”°λΌμ„œ 호좜횟수λ₯Ό λ‹€λ₯Έ κ·Έλž˜ν”„λž‘ 비ꡐ해봄) κ³΅κ°„λ³΅μž‘λ„ : μ‹œκ°„λ³΅μž‘λ„μ •λ„? μ—„μ²­ 크닀

ν•¨μˆ˜ 호좜 νšŸμˆ˜λŠ” n이 10μΌλ•Œ, 157λ²ˆμ΄λ‹€.

μ΅œμ ν™”(λ©”λͺ¨μ΄μ œμ΄μ…˜, λ‚˜μ€‘μ— DPλΆ€λΆ„μ—μ„œ λ‚˜μ˜΄)

μ—¬λŸ¬λ²ˆ κ΅¬ν•˜λŠ” 값을 λ©”λͺ¨ν•΄λ‘κ³  λ‹€μŒμ— ν•„μš”ν• λ•Œ κ³„μ‚°ν•˜μ§€ μ•Šκ³  κΊΌλ‚΄μ„œ μ“΄λ‹€.

comb(8) -> comb(7), comb(6), comb(5)
comb(7) -> comb(6), comb(5), comb(4)
comb(6) -> comb(5), comb(4), comb(3)
comb(5) -> comb(4), comb(3), comb(2)
comb(4) -> comb(3), comb(2), comb(1)
comb(3) -> comb(2), comb(1)
comb(2) -> comb(1)

μœ„μ—μ„œ 보면 comb(8)μ—μ„œ comb(7), comb(6), comb(5)λ₯Ό ν˜ΈμΆœν•˜λŠ”λ°,
comb(7)μ—μ„œ comb(6), comb(5)λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜κ²Œ λœλ‹€.
μ΄λ ‡κ²Œ μ€‘λ³΅λ˜λŠ” 계산이 λ§Žμ•„μ„œ μ‚¬μš©ν•˜λŠ” 것이 λ©”λͺ¨μ΄μ œμ΄μ…˜μΈλ°,
λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν†΅ν•΄μ„œ μ€‘λ³΅λ˜λŠ” 계산을 획기적으둜 쀄일 수 μžˆλ‹€.

λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν†΅ν•΄μ„œ μ€‘λ³΅λ˜λŠ” 계산을 쀄이면
각 ν•¨μˆ˜λ₯Ό ν•œλ²ˆμ”©λ§Œ ν˜ΈμΆœν•˜λ©΄ κ·Έ ν›„μ—λŠ” 계산할 ν•„μš” 없이 memo에 μ €μž₯된 값을 μ΄μš©ν•˜λ©΄ λœλ‹€.

μž¬κ·€λ©”λͺ¨

μ‹œκ°„λ³΅μž‘λ„ : $O(n)$
κ³΅κ°„λ³΅μž‘λ„ : $O(n)$
ν•¨μˆ˜ 호좜 νšŸμˆ˜λŠ” n이 10μΌλ•Œ, 7λ²ˆμ΄λ‹€.

λ§ˆμ§€λ§‰

DPκ°€ ν•œ κ°•μ’Œλ‘œ κ΅¬μ„±λ˜μ–΄μžˆλŠ”λ°, 이게 λ§žλ‚˜ μ‹Άλ‹€.
뒀에 λ‹€λ₯Έ κ°•μ˜μ—μ„œ 같이 병행할 것 같기도 ν•˜κ³ ,
μ•„λ‹ˆλ©΄ μ•Œκ³ λ¦¬μ¦˜ λ©΄μ ‘ λ“±μ—μ„œλŠ” 잘 μ•ˆλ‚˜μ˜€λ‚˜? 싢기도?
(μ•Œκ³ λ¦¬μ¦˜ λŒ€νšŒμ—λŠ” λ‹¨κ³¨μ΄λ˜λ°..)

λŒ“κΈ€λ‚¨κΈ°κΈ°