๐Ÿ“š ํƒ์ƒ‰(Search), ์ž๋ฃŒ๊ตฌ์กฐ(Data Structure)

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

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

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

์Šคํƒ๊ณผ ํ๋ฅผ ์‚ฌ์šฉ์‹œ ์‚ฝ์ž…,์‚ญ์ œ ์ด์™ธ ์˜ค๋ฒ„ํ”Œ๋กœ์™€ ์–ธ๋”ํ”Œ๋กœ๋„ ๊ณ ๋ฏผํ•ด์•ผํ•œ๋‹ค.

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

์Šคํƒ(Stack)

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

  1. stack.top(): ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
  2. stack.pop(): ์Šคํƒ์˜ ๊ฐ€์žฅ ์œ— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ
  3. stack.push():์Šคํƒ์˜ ๊ฐ€์žฅ ์œ„(top) ์ž๋ฆฌ ์œ„์—(top = top + 1) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑ ํ›„ ๋ฐ์ดํ„ฐ x ๋„ฃ๊ธฐ
  4. stack.empty(): ์Šคํƒ์ด ๋น„์—ˆ๋‹ค๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ๋ฐ˜ํ™˜
stack = []

stack.append(5)
stack.append(2)
stack.append(3)

stack.pop()

print(stack)
# --> [5, 2]

ํ(Queue)

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

  • ํ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” deque ์‚ฌ์šฉ.
  • deque๋Š” ์Šคํƒ๊ณผ ํ ์žฅ์ ์„ ๋ชจ๋‘ ์ฑ„ํƒํ•œ ๊ฒƒ.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” ์†๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ, queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณด๋‹ค ๊ฐ„๋‹จํ•จ.
  • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ๋„ collections ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ํ—ˆ์šฉ.
    1. Enqueue: ํ ๋งจ ๋’ค์— ์–ด๋– ํ•œ ์š”์†Œ ์ถ”๊ฐ€
    2. Dequeue: ํ ๋งจ ์•ž์ชฝ์˜ ์š”์†Œ ์‚ญ์ œ
    3. Peek: front์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ
    4. front: ํ์˜ ๋งจ ์•ž์˜ ์œ„์น˜ (์ธ๋ฑ์Šค)
    5. rear: ํ์˜ ๋งจ ๋’ค์˜ ์œ„์น˜(์ธ๋ฑ์Šค)
from collections import deque

# ํ ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
queue = deque(5)
queue = deque(2)
queue = deque(3)

print(queue)
# --> [2, 3]

์žฌ๊ท€ ํ•จ์ˆ˜

DFS, BFS๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋„ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜ Recursive Function - ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๋ฌธ์ œ ํ’€์ด์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ์–ธ์ œ ๋๋‚ ์ง€, ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๊ผญ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ์กฐ๊ฑด์ด ๋ช…์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌดํ•œ ํ˜ธ์ถœ ๋˜๋ฉฐ, ์žฌ๊ท€์˜ ์ตœ๋Œ€ ๊นŠ์ด๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.
def recursive_function():
    print("์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.")
    recursive_function()

recursive_function()

ํŒฉํ† ๋ฆฌ์–ผ ์˜ˆ์ œ

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

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