Algorithms

๋ถ„ํ•  ์ •๋ณต๋ฒ•(Divide & Conquer)

ํ’€๋ ค๋Š” ๋ฌธ์ œ๊ฐ€ ํฐ ๋ฌธ์ œ์ผ ๊ฒฝ์šฐ ๊ทธ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆ„๊ณ (Divide), ๊ทธ ๋ฌธ์ œ๋ฅผ ํ‘ผ ๋’ค(Conquer) ๋‹ค์‹œ ํ•ฉ์ณ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹(Combine)์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ด์ง„ํƒ์ƒ‰๊ณผ ํ•ฉ๋ณ‘ ์ •๋ ฌ ์žˆ๋‹ค.

print("# n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ด")
# 0 1 1 2 3 5 8 13 21 ...
def _fib(n):   
    if n ==1 or n == 2: # base case
        return 1
    else: # recursive case
        return _fib(n-1) + _fib(n-2)

# ํ…Œ์ŠคํŠธ: fib(1)๋ถ€ํ„ฐ fib(10)๊นŒ์ง€ ์ถœ๋ ฅ
for i in range(1, 11):
    print(_fib(i))

๋™์  ๊ณ„ํš๋ฒ•

๋ถ„ํ•  ์ •๋ณต๋ฒ•๊ณผ ๋น„์Šทํ•˜๊ณ  ์ฐจ์ด์ ์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ๋ฌธ์ œ๊ฐ€ ์„œ๋กœ ์ค‘์ฒฉ๋  ๊ฒฝ์šฐ ์ด์ „์— ๊ณ„์‚ฐํ•ด๋‘” ๊ฒƒ์„ ์žฌํ™œ์šฉํ•จ์œผ๋กœ์จ ๋” ๋ณตํ•ฉํ•œ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Memoization

๋ถ„ํ™œ ์ •๋ณต๋ฒ•๊ณผ ๋น„์Šทํ•˜๋ฉฐ, ์ฐจ์ด์ ์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ๋ฉ”๋ชจํ•˜๋ฉด์„œ ์žฌ๊ท€์ ์œผ๋กœ ํ‘ผ๋‹ค. (Top-down Approach)

Tabulation

ํ…Œ์ด๋ธ” ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค. ์ค‘๋ณต ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ‘ผ๋‹ค. (Bottom-up Approach) ๋ถ„ํ•  ์ •๋ณต๋ฒ•๊ณผ ๋น„์Šทํ•˜๋ฉฐ, ์ฐจ์ด์ ์€ ํ…Œ์ด๋ธ” ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ‘ผ๋‹ค. Memoization๊ณผ ์ฐจ์ด์ ์€ ์žฌ๊ท€ ๋Œ€์‹  ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

print("# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด - Memoization")
# ์žฌ๊ท€๋ฐฉ์‹์œผ๋กœ ํ‘ผ๋‹ค.
# ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ๋ฉ”๋ชจํ•˜๋ฉด์„œ ํ‘ผ๋‹ค (Top-down Approach)
def fib_memo(n, cache):
    if n == 1 or n == 2:
        cache[n] = 1
        return 1
    else:
        if not cache.get(n, None):
            cache[n] = fib_memo(n-2, cache) + fib_memo(n-1, cache)
        return cache.get(n)

cache = {} # !!
for i in range(1, 11):
    print(fib_memo(i, cache))
print("# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด - Tabulation")
# ํ…Œ์ด๋ธ” ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.
# ์ค‘๋ณต ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ‘ผ๋‹ค. (Bottom-up Approach)
def fib_tab(n):
    cache = {1:1, 2:1} # !!
    for i in range(1, n):
        if not cache.get(i, None):
            cache[i] = cache.get(i-2) + cache.get(i-1)
    return cache.get(n-2) + cache.get(n-1)

print(fib_tab(10))

ํƒ์š•์  ๋ฐฉ๋ฒ• (Greedy Algorithm)

๊ทธ๋•Œ ๊ทธ๋•Œ ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ ์ตœ์ ์˜ ๋‹ต์ด ๋ณด์žฅ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ตœ ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Kruskal algorithm)๊ณผ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Prim algorithm)์ด ์žˆ๊ณ  ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค. ํฌ๋ฃจ์Šค์นผ์€ ์ตœ์ดˆ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ์ธ ์ƒํƒœ์—์„œ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ„์„ ์„ ๊ณ ๋ฅธ ํ›„ ํ•ด๋‹นํ•˜๋Š” ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋‘ ๋…ธ๋“œ๋ฅผ ํ•ฉ์ณ๋‚˜๊ฐ€๋ฉด์„œ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ”„๋ฆผ์€ ์•„๋ฌด ๋…ธ๋“œ๋‚˜ ์‹œ์ž‘๋…ธ๋“œ๋กœ ์„ค์ •ํ•˜๊ณ  ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ๊ฐ€์ค‘์น˜๊ฐ€ ์ž‘์€ ๊ฐ„์„ ์„ ์ฐจ๋ก€๋กœ ๋ถ™์—ฌ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๊ฐ€๋ฉด์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด์ƒ์ธ ๊ทธ๋ž˜ํ”„์—์„œ๋งŒ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.\

์™„์ „ํƒ์ƒ‰

๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ์‹œ๋„ํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋А๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์ง€์น˜๊ธฐ๋กœ ๊ณ„์‚ฐ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ตœ์†Œ๋น„์šฉ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์‚ฐ๋œ ์ตœ์†Œ๋น„์šฉ์ด 100์ด๋ผ๋ฉด 100๋ณด๋‹ค ํฐ ๋น„์šฉ์€ ํƒ์ƒ‰ํ•˜์ง€ ํ•˜์ง€ ์•Š์•„ ๊ณ„์‚ฐ์„ ์ค„์ด๋Š” ์‹์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ DFS, BFS ๊ฐ€ ์žˆ๋‹ค.

print("# ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด - ๋ฐ˜๋ณต๋ฌธ")
def fib_iter(n):
    series = [0,1,1]
    for i in range(3, n):
        next_element = series[i-2] + series[i-1]
        series.append(next_element)
    return series[n-2] + series[n-1]

print(fib_iter(10))

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ๋น…์˜ค(O) ํ‘œ๊ธฐ๋ฒ•

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ์€ ์‹œ๊ฐ„๋ณต์žก๋„(Time Complexity)์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ๊ณต๊ฐ„๋ณต์žก๋„(Space Complexity)์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์žˆ๋‹ค. ๋น…์˜ค์˜ ์ˆœ์„œ O(1) < O(logn) < O(n) < O(nlogn) < O(n2)

Last updated

Was this helpful?