์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค] DFS/BFS <1. ๊ผญ ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ๊ธฐ์ดˆ>

๋ฉœ๋ก ์ด์ฆˆ 2022. 2. 2. 22:54

๐Ÿ”ํƒ์ƒ‰(Search)

ํƒ์ƒ‰์ด๋ž€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ทธ๋ž˜ํ”„, ํŠธ๋ฆฌ ๋“ฑ์˜ ์ž๋ฃŒ๊ตฌ์กฐ ์•ˆ์—์„œ ํƒ์ƒ‰์„ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ž์ฃผ ๋‹ค๋ฃฌ๋‹ค.
๋Œ€ํ‘œ์ ์ธ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)๊ณผ BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰) ๋‘ ๊ฐ€์ง€๋ฅผ ๊ผฝ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, DFS์™€ BFS๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์Šคํƒ๊ณผ ํ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์Šคํƒ๊ณผ ํ, ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ”์ž๋ฃŒ๊ตฌ์กฐ(Data Structure)

์ž๋ฃŒ๊ตฌ์กฐ๋Š” '๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ' ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๊ทธ ์ค‘ ์Šคํƒ๊ณผ ํ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ธฐ์ดˆ ๊ฐœ๋…์œผ๋กœ ๋‹ค์Œ ๋‘ ํ•ต์‹ฌ์ ์ธ ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • ์‚ฝ์ž…(Push) : ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ์‚ญ์ œ(Pop) : ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.


์‹ค์ œ๋กœ ์Šคํƒ๊ณผ ํ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ(Overflow)์™€ ์–ธ๋”ํ”Œ๋กœ(Underflow)๋ฅผ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค.

  • ์˜ค๋ฒ„ํ”Œ๋กœ(Overflow) : ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ด๋ฏธ ๊ฐ€๋“ ์ฐฌ ์ƒํƒœ์—์„œ ์‚ฝ์ž… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
  • ์–ธ๋”ํ”Œ๋กœ(Underflow) : ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ํ˜€ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์‚ญ์ œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ“š์Šคํƒ(Stack)

์Šคํƒ์€ ์„ ์ž…ํ›„์ถœ(FILO) ๋˜๋Š” ํ›„์ž…์„ ์ถœ(LIFO) ๊ตฌ์กฐ ์ด๋‹ค.
๋ฐ•์Šค ์Œ“๊ธฐ์— ๋น„์œ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ์„ ์ด์šฉํ•  ๋•Œ๋Š” ๋”ฐ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
๊ธฐ๋ณธ ๋ฆฌ์ŠคํŠธ์—์„œ append()์™€ pop() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
append() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋’ค์ชฝ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , pop() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋’ค์ชฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ“šํ(Queue)

ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO) ๊ตฌ์กฐ ์ด๋‹ค.
๋Œ€๊ธฐ ์ค„์— ๋น„์œ ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ด์ฌ์—์„œ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” deque ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์ž.
deque๋Š” ์Šคํƒ๊ณผ ํ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ฑ„ํƒํ•œ ๊ฒƒ์ธ๋ฐ
๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” ์†๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๋‹ค.

๐Ÿ“š์žฌ๊ท€ ํ•จ์ˆ˜(Recursive Function)

์žฌ๊ท€ ํ•จ์ˆ˜๋ž€ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๊ฐ„๋‹จํ•œ ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

def recursive_function():
    print("์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.")
    recursive_function()

recursive_function()

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด '์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.' ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฌดํ•œํžˆ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ •์˜ํ•œ revursive_function()์ด ์ž๊ธฐ ์ž์‹ ์„ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌผ๋ก  ์–ด๋Š์ •๋„ ์ถœ๋ ฅํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋ฉˆ์ถœ ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ ์กฐ๊ฑด

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๋ฌธ์ œ ํ’€์ด์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋ฌดํ•œํžˆ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์–ธ์ œ ๋๋‚ ์ง€, ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๊ผญ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋กœ ๋‹ค์Œ์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ 100๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
์žฌ๊ท€ ํ•จ์ˆ˜ ์ดˆ๋ฐ˜์— ๋“ฑ์žฅํ•˜๋Š” if๋ฌธ์ด ์ข…๋ฃŒ ์กฐ๊ฑด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

def recursive_function(i):
    if i == 100:
        return
    print(i, '๋ฒˆ์งธ ์žฌ๊ท€ ํ•จ์ˆ˜์—์„œ', i+1, '๋ฒˆ์งธ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.')
    recursive_function(i+1)
    print(i, '๋ฒˆ์งธ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.')

recursive_function(1)

์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๋‹ค.
๋”ฐ๋ผ์„œ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•  ๋•Œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.
DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)์ด ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋Œ€ํ‘œ์  ์˜ˆ์ œ๋กœ ํŒฉํ† ๋ฆฌ์–ผ(Factorial)๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

ํŒฉํ† ๋ฆฌ์–ผ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹๊ณผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋‘ ๋ฐฉ์‹์„ ๋น„๊ตํ•ด๋ณด์ž.

# ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_iterative(n):
    result = 1
    # 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณฑํ•˜๊ธฐ
    for i in range(1, n+1):
        result *= i
    return result

# ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_recursive(n):
    if n <= 1:      # n์ด 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜
        return 1
    # n! = n * (n-1)! ๋ฅผ ๊ทธ๋ž˜๋„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
    return n * factorial_recursive(n-1)

# ๊ฐ๊ฐ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ n! ์ถœ๋ ฅ (n=5)
print('๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_iterative(5))
print('์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_recursive(5))

๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„: 120
์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„: 120

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™์ง€๋งŒ ๋ฐ˜๋ณต๋ฌธ ๋Œ€์‹  ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๋‹ค.
๊ทธ ์ด์œ ๋Š” ์ˆ˜ํ•™์˜ ์ ํ™”์‹(์žฌ๊ท€์‹)์„ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ์— ์˜ฎ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
ํŒฉํ† ๋ฆฌ์–ผ์„ ์ˆ˜ํ•™์  ์ ํ™”์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • n์ด 0 ํ˜น์€ 1์ผ ๋•Œ : factorial(n) = 1
  • n์ด 1๋ณด๋‹ค ํด ๋•Œ : factorial(n) = n x factorial(n-1)


์ ํ™”์‹์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•ž ์˜ˆ์‹œ์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์€ 'n์ด 0ํ˜น์€ 1์ผ ๋•Œ' ์ด๋‹ค.
ํŒฉํ† ๋ฆฌ์–ผ์€ n์ด ์–‘์˜ ์ •์ˆ˜์ผ ๋•Œ๋งŒ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— n์ด 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
n์ด 1 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณต ๋˜์–ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•  ๊ฒƒ ์ด๋‹ค.
๋˜ํ•œ n์˜ ๊ฐ’์œผ๋กœ ์Œ์ˆ˜๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ๋Š” ์ž…๋ ฅ ๋ฒ”์œ„ ์˜ค๋ฅ˜๋กœ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์šฐ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์žฌ๊ท€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ํŠน์ • ์กฐ๊ฑด์ผ ๋•Œ ๋” ์ด์ƒ ์žฌ๊ท€์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•˜๋„๋ก if๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๊ผญ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.






โ€ป ํ•ด๋‹น ํฌ์ŠคํŒ…์€ใ€Œ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค(๋‚˜๋™๋นˆ ์ €)ใ€์ฑ… ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.