๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

DFS / BFS (๊นŠ์ด์šฐ์„ ํƒ์ƒ‰ / ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰)

sssbin 2022. 1. 28. 20:30

 

์Šคํƒ (LIFO)

stack = []

stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

print(stack)          # ์ตœํ•˜๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ
print(stack[::-1])    # ์ตœ์ƒ๋‹จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

- ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๋ฆฌ์ŠคํŠธ์˜ append(), pop() ๋ฉ”์„œ๋“œ ์ด์šฉ

 

 

ํ (FIFO)

from collections import deque

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

queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

print(queue)        # ๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ
queue.reverse()     # ๋‹ค์Œ ์ถœ๋ ฅ์„ ์œ„ํ•ด ์—ญ์ˆœ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
print(queue)        # ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ์›์†Œ๋ถ€ํ„ฐ ์ถœ๋ ฅ

- collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” deque ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉ (์Šคํƒ+ํ์˜ ์žฅ์ )

- ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋นผ๋Š” ์†๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์— ๋น„ํ•ด ํšจ์œจ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๊ฐ„๋‹จํ•จ.

- list() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด deque ๊ฐ์ฒด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ.

 

 

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

- ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜

- ์ข…๋ฃŒ ์กฐ๊ฑด ๋ช…์‹œ

- ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์—์„œ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰์€ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉ

- ๋”ฐ๋ผ์„œ ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ. ex) DFS

##### ์žฌ๊ท€ ํ•จ์ˆ˜ ์˜ˆ์‹œ - ํŒฉํ† ๋ฆฌ์–ผ #####

# ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_iterative(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

# ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ n!
def factorial_recursive(n):
    if n <= 1:  # ์ข…๋ฃŒ ์กฐ๊ฑด
        return 1
    return n * factorial_recursive(n-1)

print('๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_iterative(5))
print('์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„:', factorial_recursive(5))

 

 

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

- ์ธ์ ‘ ํ–‰๋ ฌ: 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

- ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ: ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

์ธ์ ‘ํ–‰๋ ฌ - ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„. but ํƒ์ƒ‰ ๋น ๋ฆ„ / ์ธ์ ‘๋ฆฌ์ŠคํŠธ - ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ . but ํƒ์ƒ‰ ๋А๋ฆผ

# ์ธ์ ‘ ํ–‰๋ ฌ: 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

INF = 99999999999 # ๋ฌดํ•œ์˜ ๋น„์šฉ ์„ ์–ธ (์ดˆ๊ธฐํ™”)

graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]

print(graph)
# ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ: ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

# ํ–‰(Row)์ด 3๊ฐœ์ธ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„
graph = [[] for _ in range(3)]

# ๋…ธ๋“œ 0์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[0].append((1, 7))
graph[0].append((2, 5))

# ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[1].append((0, 7))

# ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ(๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[2].append((0, 5))

print(graph)

 

 

DFS (๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

- ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉ -> ์žฌ๊ท€ ํ•จ์ˆ˜

- ๋™์ž‘ ๊ณผ์ •

    1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

    2) ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

        ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

    3) 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋”์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

- ์‹ค์ œ๋กœ๋Š” ์Šคํƒ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ํƒ์ƒ‰ ์‹œ๊ฐ„ O(N)

# DFS ํ•จ์ˆ˜ ์ •์˜
def dfs(graph, v, visited):
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end=' ')
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9

# ์ •์˜๋œ DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
dfs(graph, 1, visited)

 

 

BFS (๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

- ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉ

- ๋™์ž‘ ๊ณผ์ •

    1) ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

    2) ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

    3) 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋”์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

- O(N). ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ DFS๋ณด๋‹ค ์ข‹์€ ํŽธ.

from collections import deque

# BFS ํ•จ์ˆ˜ ์ •์˜
def bfs(graph, start, visited):
    # ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque([start])
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[start] = True
    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
        # ํ์—์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๋ฝ‘์•„ ์ถœ๋ ฅ
        v = queue.popleft()
        print(v, end=' ')
        # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ, ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์›์†Œ๋“ค์„ ํ์— ์‚ฝ์ž…
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์œผ๋กœ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False] * 9

# ์ •์˜๋œ BFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
bfs(graph, 1, visited)

 

 

์˜ˆ์ œ1. ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

n, m = map(int, input().split())
list = [[] for _ in range(n)]

for i in range(n):
    data = input()
    for j in range(m):
        list[i].append(int(data[j]))

def dfs(x, y):
    if x < 0 or x >= n or y < 0 or y >= m:  # x, y ์ขŒํ‘œ๊ฐ€ ๋งต์„ ๋ฒ—์–ด๋‚˜๋ฉด
        return False
    if list[x][y] == 0: # ์–ผ์Œ ํ‹€์— ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„
        list[x][y] = 1 # ๋ฐฉ๋ฌธ ์ฒดํฌ
        # ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ฒดํฌ
        dfs(x+1, y)
        dfs(x-1, y)
        dfs(x, y+1)
        dfs(x, y-1)
        return True
    else:
        return False

result = 0
for i in range(n):
    for j in range(m):
        if dfs(i, j) == True:
            result += 1

print(result)

- DFS๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

    1) ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์‚ดํŽด๋ณธ ๋’ค์—

        ์ฃผ๋ณ€ ์ง€์  ์ค‘ ๊ฐ’์ด '0'์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์  ๋ฐฉ๋ฌธ

    2) ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์‚ดํ”ผ๋ฉด์„œ ๋ฐฉ๋ฌธ ๋‹ค์‹œ ์ง„ํ–‰

 

 

์˜ˆ์ œ2. ๋ฏธ๋กœ ํƒˆ์ถœ

๋‚  ์•„์ฃผ ํ™”๋‚˜๊ฒŒ ํ•œ ๋ฌธ์ œ์ž„,,,,,, ์˜ˆ์ œ ์ฝ”๋“œ๋ž‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋˜‘๊ฐ™์€๋ฐ ๋‚ด ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜ ๋œธ,,,

๋Œ€์ฒด ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ๊ฑธ๊นŒ,,,,,,,,,,,,,,,,,,,,,,,,, 

from collections import deque

# N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ ๋ฐ›๊ธฐ
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# ์ด๋™ํ•  ๋„ค ๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜ (์ƒ, ํ•˜, ์ขŒ, ์šฐ)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# BFS ์†Œ์Šค์ฝ”๋“œ ๊ตฌํ˜„
def bfs(x, y):
    # ํ(Queue) ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    queue = deque()
    queue.append((x, y))
    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ธฐ
    while queue:
        x, y = queue.popleft()
        # ํ˜„์žฌ ์œ„์น˜์—์„œ 4๊ฐ€์ง€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if nx < 0 or nx >= n or ny < 0 or ny >= m:
                continue
            # ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋ฌด์‹œ
            if graph[nx][ny] == 0:
                continue
            # ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                queue.append((nx, ny))
    # ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐ˜ํ™˜
    return graph[n - 1][m - 1]

# BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(bfs(0, 0))

- BFS๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ์›๋ฆฌ๋กœ ์ž‘๋™ํ•จ

 

์—ญ์‹œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋Š” ์–ด๋ ต๋‹ค

๋‚˜๋ž‘ ์•ˆ ๋งž ์•„