# ๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
: ๋ ธ๋Node์ ๊ฐ์ Edge๋ก ํํ๋๋ฉฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ Vertex๋ผ๊ณ ๋ ๋งํ๋ค.
๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ์
- ์ธ์ ํ๋ ฌ(Adjacency Matrix): 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 ๋ฐฐ์ด์ ์ฌ์ฉํ์ง ์๊ณ ์ฝ๋๋ฅผ ์งค ์๊ฐ ์๊ตฌ๋....
'๐ Study > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ์ต๋จ ๊ฒฝ๋ก (0) | 2025.04.05 |
---|---|
[Algorithm] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (0) | 2025.03.04 |
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ถ๋ฌธ์ (0) | 2024.06.26 |
[Algorithm] ๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ (0) | 2024.06.26 |
[์๊ณ ๋ฆฌ์ฆ] 2์ฃผ์ฐจ ๊ฐ์ | ์ฐ์ ์์ ํ ADT, ์ ์๋ฆฌ ์ ํ์ ๋ ฌ, ์ ์๋ฆฌ ์ฝ์ ์ ๋ ฌ (2) | 2022.09.10 |