๐Ÿ“š Study/Algorithm

[Algorithm] ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ DFS, BFS

์œฐ๊ฐฑ 2025. 4. 6. 00:51

# ๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

: ๋…ธ๋“œNode์™€ ๊ฐ„์„ Edge๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ Vertex๋ผ๊ณ ๋„ ๋งํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹

  1. ์ธ์ ‘ํ–‰๋ ฌ(Adjacency Matrix): 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ ํ‘œํ˜„
  2. ์ธ์ ‘๋ฆฌ์ŠคํŠธ(Adjacency List): ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ ํ‘œํ˜„

 

์ธ์ ‘ํ–‰๋ ฌAdjacency Matrix

INF = 1e7 # ๋ฌดํ•œ์˜ ๋น„์šฉ ์„ ์–ธ

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„
graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]

print(graph)

์ธ์ ‘๋ฆฌ์ŠคํŠธ(Adjacency List)

# ํ–‰(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)

์ธ์ ‘ํ–‰๋ ฌ vs ์ธ์ ‘๋ฆฌ์ŠคํŠธ

  • ์ธ์ ‘ํ–‰๋ ฌ ์žฅ์ : ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๋‘ ์—ฐ๊ฒฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด ์–ป๋Š” ์†๋„ ๋น ๋ฆ„
  • ์ธ์ ‘๋ฆฌ์ŠคํŠธ ์žฅ์ : ์ธ์ ‘ํ–‰๋ ฌ์— ๋น„ํ•ด ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ

# DFS

Depth-First Search, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ ๊บผ๋ƒ„
3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ: ์Šคํƒ์— ํ•œ ๋ฒˆ ์‚ฝ์ž…๋˜์–ด ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋‹ค์‹œ ์‚ฝ์ž…๋˜์ง€ ์•Š๊ฒŒ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

ex.

 

๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4 -> 5

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(N)$์ด๋‹ค.

 

DFS๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ๊ตฌํ˜„์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

# DFS Method
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

Breadth-First Search, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” DFS์™€ ๋ฐ˜๋Œ€์ด๋‹ค.

 

BFS ๊ตฌํ˜„์—์„œ๋Š” ์„ ์ž…์„ ์ถœ ๋ฐฉ์‹์ธ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค.

1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 

 

๊ฐ™์€ ์˜ˆ์‹œ๋กœ ์ง„ํ–‰ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

 

๋…ธ๋“œ ํƒ์ƒ‰ ์ˆœ์„œ(ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)

1-> 2-> 3-> 8-> 7-> 4-> 5-> 6

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” $O(N)$์ด๋‹ค.

 

DFS๋Š” ํ๋ฅผ ์ด์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ณ , deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ ์‹ค์ œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ DFS๋ณด๋‹ค ์ข‹์€ ํŽธ์ด๋‹ค.

from collections import deque

# BFS ๋ฉ”์„œ๋“œ ์ •์˜
def bfs(graph, start, visited):
    # ํ ๊ตฌํ˜„์„ ์œ„ํ•ด 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)


DFS vs BFS

 

DFS
1) ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์ „ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ํ™œ์šฉ๊ฐ€๋Šฅ
2) ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ํƒ์ƒ‰์„ ํ•ด์•ผ๋ ๊ฒฝ์šฐ ์ด์šฉ(์œ„์˜ ์˜ˆ์˜ ๊ฒฝ์šฐ ์กฐํ•ฉ, ์ˆœ์—ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ํ•˜๋‚˜ํ•œ ๋‹ค ์ฐพ๊ณ ์žํ• ๋•Œ)
3) ์œ„์˜ ๊ฐœ๋…๊ณผ ๊ฒฐ๋ถ€๋œ ๊นŠ์ด ์šฐ์„ ํƒ์ƒ‰์ด๋ผ๋Š” ๊ฐœ๋…์„ ๊ฐ€์ง„ ์ˆœ์—ด, ์กฐํ•ฉ ๊ตฌํ˜„์— ํ™œ์šฉ

BFS
1) DFS์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„๋ฅผ ์™„์ „ํƒ์ƒ‰ํ•˜๋Š”๋ฐ ํ™œ์šฉ
2) depth(๊นŠ์ด)๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ๋˜๋Š” ๋ฌธ์ œ์— ํ™œ์šฉ(์œ„์˜ ๋ฌธ์ œ์˜ˆ์˜ ๊ฒฝ์šฐ ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ธธ์ด == depth(๊นŠ์ด))
3) ์œ„์˜ ๊ฐœ๋…๊ณผ ๊ฒฐ๋ถ€๋œ ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋Š”๋ฐ ํ™œ์šฉ

(์ถœ์ฒ˜: https://foameraserblue.tistory.com/188?category=481823)

 


https://www.youtube.com/watch?v=BsYbdUnKZ-Y

 


# ์˜ˆ์ œ ๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” dfs๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒ/ํ•˜/์ขŒ/์šฐ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค ์ฃผ๋ณ€ ์ง€์  ์ค‘์—์„œ ๊ฐ’์ด '0'์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์  ๋ฐฉ๋ฌธ

2. ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒ/ํ•˜/์ขŒ/์šฐ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๋ฉด  > ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์  ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ

3. 1&2๋ฒˆ ๊ณผ์ •์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜ ์„ธ๊ธฐ

๐Ÿ’ก
์œ„์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ visited ๋ฐฐ์—ด์„ ๊ตณ์ด ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„
0: ๋ฐฉ๋ฌธ ์•ˆํ•จ
1: ๋ฐฉ๋ฌธ ํ•จ
์ด๋ ‡๊ฒŒ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค

 

import sys
sys.stdin = open("input.txt", "r")

n, m = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().strip())) for _ in range(n)]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

# dfs๋กœ ํŠน์ • ๋…ธ๋“œ ๋ฐฉ๋ฌธ ํ›„์— ์žฌ๊ท€์  ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ
def dfs(x,y):
    # ์ฃผ์–ด์ง„ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ์ข…๋ฃŒ
    if x <= -1 or x >= n or y <= -1 or y >= m:
        return False
     
    if graph[x][y] == 0:
        graph[x][y] = 1
        for i in range(4):
            dfs(x + dx[i], y + dy[i])
        return True
    return False

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

 

'์ตœ์†Œ' > ์ด๋Ÿฐ ์–˜๊ธฐ๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด bfs๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

(1,1)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ '1'์˜ ๊ธธ๋งŒ์„ ์ซ“์•„๊ฐ€ (N,M)์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ’ก
visited ๋ฐฐ์—ด์„ ๊ตณ์ด ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„
1์˜ ๊ธธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ์˜ฌ๋ ค์„œ ๊ฐ€๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
(visited ๋ฐฐ์—ด๋„ ํ•„์š” ์—†๊ณ , ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋„ ๋งŒ๋“ค ํ•„์š” ์—†๋Š” ๊ฒƒ)
import sys
from collections import deque
sys.stdin = open("input.txt", "r")

n, m = map(int, sys.stdin.readline().split())
graph = [list(map(int, sys.stdin.readline().strip())) for _ in range(n)]

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

# BFS ์†Œ์Šค์ฝ”๋“œ
def bfs(x,y):  
    queue = deque()
    queue.append((x,y))

    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
        x, y = queue.popleft()
        # ํ˜„์žฌ ๋ฐฉํ–ฅ์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ์˜ ์œ„์น˜ ํ™•์ธ
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # ๋ฏธ๋กœ ์ฐพ๊ธฐ ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ
            if nx <= -1 or nx >= n or ny <= -1 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))

 

 

์ขŒํ‘œ๋กœ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ์—๋Š” visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜๊ฐ€ ์žˆ๊ตฌ๋‚˜....