๐Ÿ‘‰์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜ - 11

ํ•™์Šต๊ธฐ๋ก

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ๊ณต๊ฐ„๋ณต์žก๋„ - 1
  2. ๊ณต๊ฐ„๋ณต์žก๋„ - 2
  3. ์žฌ๊ท€ - 1

๊ณต๊ฐ„๋ณต์žก๋„?

๊ณต๊ฐ„

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํšจ์œจ์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€์€ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ €๋ฒˆ์— ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€(๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€)๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ ,
๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”ํ•œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋Œ€๋ถ€๋ถ„ ๋‘˜ ๋‹ค ๋งŒ์กฑ์‹œํ‚ค๊ธฐ๋Š” ์–ด๋ ต๋‹ค.
์„œ๋กœ ๋ฐ˜๋น„๋ก€์ ์ธ ๊ด€๊ณ„๋‹ค.
์š”์ฆ˜์€ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์šฐ์„ ์ธ๋ฐ, ์™œ๋ƒํ•˜๋ฉด ์˜›๋‚ ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ–ˆ์ง€๋งŒ,
ํ˜„๋Œ€์—๋Š” ๋Œ€๋ถ€๋ถ„ ๋Œ€์šฉ๋Ÿ‰์œผ๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ ๋น…๋ฐ์ดํ„ฐ ๋“ฑ์—์„œ๋Š” ์‹ ๊ฒฝ์“ด๋‹ค๊ณ  ํ•จ.

๊ทธ๋Ÿผ์—๋„ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ๋ฐฐ์šฐ๋Š” ์ด์œ ๋Š”,
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ๊ฑธ๋ ค์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์ •ํ•ด์ค€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋„˜์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๋กœ ์ธํ•ด ํ‹€๋ ธ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.
๋ฉด์ ‘์‹œ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ๋ฌป๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•จ.

๊ณต๊ฐ„๋ณต์žก๋„ (Space Complexity)

$S(P)=c+S_p(n)$ $c$ : ์ƒ์ˆ˜ ๊ณต๊ฐ„ $S_p(n)$ : ๊ฐ€๋ณ€ ๊ณต๊ฐ„

๊ณต๊ฐ„๋ณต์žก๋„ ๊ณ„์‚ฐ 1

def factorial(n):
    if n > 1:
        return n * factorial(n - 1)
    else:
        return 1

๊ณต๊ฐ„๋ณต์žก๋„ : $O(n)$

์ด ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ factorial(n), factorial(n - 1), factorial(n - 2), โ€ฆ, factorial(1)๊นŒ์ง€ ์‹คํ–‰๋œ๋‹ค. factorial์ด ํ•œ๋ฒˆ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๋ณ€์ˆ˜๋Š” n์œผ๋กœ ํ•œ๊ฐœ์ด๋‹ค.
factorial์ด n๋ฒˆ ์‹คํ–‰๋˜๋ฏ€๋กœ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(n)๊ณผ ๊ฐ™๋‹ค.

๊ณต๊ฐ„๋ณต์žก๋„ ๊ณ„์‚ฐ 2

def factorial(n):
    fac = 1
    for index in range(2, n + 1):
        fac = fac * range
    return fac

๊ณต๊ฐ„๋ณต์žก๋„ : $O(1)$ ๋ณ€์ˆ˜๊ฐ€ index์™€ fac ๋‘˜๋งŒ ํ•„์š”ํ•˜๊ธฐ๋•Œ๋ฌธ์— ๊ณต๊ฐ„๋ณต์žก๋„๋Š” $O(1)$์ด ๋œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ๋ณ€์ˆ˜์˜ ๊ฐฏ์ˆ˜๋งŒํผ ์„ธ๋ฉด ๋œ๋‹ค.

์žฌ๊ท€ ํ˜ธ์ถœ (recursive call)

ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ
์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘์„ฑ์‹œ ์œ ์šฉํ•˜๊ฒŒ ์ž‘์„ฑ๋œ๋‹ค
์žฌ๊ท€ ํ˜ธ์ถœ์„ ์•ˆ์“ฐ๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ถˆํŽธํ•œ๊ฒฝ์šฐ๋„ ๊ฝค๋งŽ๋‹ค (+ ์žฌ๊ท€ํ˜ธ์ถœ์ด ๊ณ„์†๋˜๋ฉด, ์Šคํƒ์— ์Œ“์—ฌ์„œ ๊ณต๊ฐ„์„ ์€๊ทผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค)

ํŒฉํ† ๋ฆฌ์–ผ ์žฌ๊ท€ํ•จ์ˆ˜ ๊ตฌํ˜„

def factorial(num):
    if num > 1:
        return num * factorial(num - 1)
    else:
        return num
for num in range(10):
    print(factorial(num))

ํŒฉํ† ๋ฆฌ์–ผ

์‚ฌ์ง„์ฒ˜๋Ÿผ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.

factorial(num) -> num * factorial(num - 1) -> num * num - 1 * factorial(num - 2) โ€ฆ
์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

๋งˆ์ง€๋ง‰

๊ณต๊ฐ„๋ณต์žก๋„๋„ ์•Œ์•„์•ผํ•œ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€์•Š์•„์„œ ๊ทธ๋ƒฅ ๊ธˆ๋ฐฉ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
c๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋ฃŒํ˜•๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ์žˆ์–ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
(ํŒŒ์ด์ฌ์€ ๋ณ€์ˆ˜ ํ•˜๋‚˜์— ์–ผ๋งˆ๋‚˜ ๋จน๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ฐพ์•„๋ณธ์ ์ด ์—†์–ด์„œ)

์ˆ˜๊ฐ•์ธ์ฆ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ