1. ๊ผญ ํ์ํ ์๋ฃ๊ตฌ์กฐ ๊ธฐ์ด
ํ์
: ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ , ๋ํ์ ์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS, BFS์๋ฃ๊ตฌ์กฐ
: ๋ฐ์ดํฐ๋ฅผ ํํํ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ์กฐ
์คํ Stack
- ์ ์
ํ์ถ
First In Last Out
๊ตฌ์กฐ ๋๋ ํ์ ์ ์ถLast In First Out
๊ตฌ์กฐ - ํ์ด์ฌ์์ ์คํ์ ์ด์ฉํ ๋๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด
append()
pop()
list
๋ฅผ ํ์ฉํ๋ค.
ํ Queue
- ์ ์
์ ์ถ
First In First Out
๊ตฌ์กฐ
from collections import deque
queue = deque()
queue.append(5)
queue.append(2)
queue.append(3)
queue.popleft()
- ํ์ด์ฌ์ผ๋ก ํ๋ฅผ ๊ตฌํํ ๋๋ collections ๋ชจ๋์์ ์ ๊ณตํ๋
deque
์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์. - ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ ์๋๊ฐ ๋ฆฌ์คํธ์ ๋นํด ํจ์จ์ ์ด๋ฉฐ queue ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๋ค.
์ฌ๊ทํจ์
- ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์
- ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฌดํ ํธ์ถ๋์ง ์๋๋ก ์ฌ๊ทํจ์์ ์ข ๋ฃ์กฐ๊ฑด์ ๋ฐ๋์ ๋ช ์ํด์ผ ํ๋ค.
- ์ปดํจํฐ ๋ด๋ถ์์ ์ฌ๊ท ํจ์์ ์ํ์ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
- ๋ฐ๋ณต๋ฌธ ๋์ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๋ค.
2. ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS
- ๊ทธ๋ํ๋ Node์ Edge๋ก ํํ๋๋ฉฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ ์ด๋ผ๊ณ ๋ ๋งํ๋ค.
- ๊ทธ๋ํ ํ์์ด๋, ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค.
- ๋ ๋
ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด
๋ ๋ ธ๋๋ ์ธ์ ํ๋ค
๋ผ๊ณ ํํํ๋ค.
๊ทธ๋ํ๋ฅผ ๋ํ๋ด๋ ๋ฐฉ์
- ์ธ์ ํ๋ ฌ : 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์
- ์ธ์ ๋ฆฌ์คํธ : ๋ชจ๋ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅ (ํ์ด์ฌ์ 2์ฐจ์ ๋ฆฌ์คํธ)
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ํจ์จ์
DFS (Depth-First Search), ๊น์ด ์ฐ์ ํ์
- ํน์ ํ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์๋ค๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. (๋ฎ์ ๋ฒํธ ์) ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
2
๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค. ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ์ธ ๊ฒฝ์ฐ O(N)์ ์๊ฐ์ด ์์๋๋ค.
๊ตฌํ์ฝ๋
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]: dfs(graph, i, visited)
graph = [
[], [2,3,8], [1,7], [1,4,5], [3,5], [3,4], [7], [2,6,8], [1,7]
]
visited = [False] * 9
dfs(graph, 1, visited)
BFS (Breadth First Search), ๋๋น ์ฐ์ ํ์
- ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
2
๋ฒ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ค์ ๋ก ๊ตฌํํจ์ ์์ด
deque
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ O(N)์ ์๊ฐ์ด ์์๋๋ค. - ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ!
๊ตฌํ ์ฝ๋
from collections import deque
def bfs(graph, start, visited) :
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
3. ์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ
๋์ด๋ ์คํ
๋ฌธ์
N * M ํฌ๊ธฐ์ ์ผ์ ํ์ด ์๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ์ 0, ์นธ๋ง์ด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ์ 1๋ก ํ์๋๋ค. ๊ตฌ๋ฉ์ด ๋ซ๋ ค ์๋ ๋ถ๋ถ๊น์ง ์, ํ, ์ข, ์ฐ๋ก ๋ถ์ด ์๋ ๊ฒฝ์ฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ์ด๋ ์ผ์ ํ์ ๋ชจ์์ด ์ฃผ์ด์ก์ ๋ ์์ฑ๋๋ ์ด ์์ด์คํฌ๋ฆผ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํด์ค
์ด ๋ฌธ์ ๋ DFS๋ก ํด๊ฒฐํ ์ ์๋ค. ์ผ์์ ์ผ๋ฆด ์ ์๋ ๊ณต๊ฐ์ด ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํํํ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ํ ํํ๋ก ๋ชจ๋ธ๋งํ ์ ์๋ค.
- ํน์ ํ ์ง์ ์ ์ฃผ๋ณ ์, ํ, ์ข, ์ฐ๋ฅผ ์ดํด๋ณธ ๋ค์ ์ฃผ๋ณ ์ง์ ์ค์์ ๊ฐ์ด
0
์ด๋ฉด์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ด ์๋ค๋ฉด ํด๋น ์ง์ ์ ๋ฐฉ๋ฌธํ๋ค. - ๋ฐฉ๋ฌธํ ์ง์ ์์ ๋ค์ ์, ํ, ์ข, ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด์ ๋ฐฉ๋ฌธ์ ๋ค์ ์งํํ๋ฉด, ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ง์ ์ ๋ฐฉ๋ฌธํ ์ ์๋ค.
1~2
๋ฒ ๊ณผ์ ์ ๋ชจ๋ ๋ ธ๋์ ๋ฐ๋ณตํ๋ฉด ๋ฐฉ๋ฌธํ์ง ์์ ์ง์ ์ ์๋ฅผ ์ผ๋ค.
์ฝ๋
n, m = map(int, input().split())
graph = []
for i in range(n) :
graph.append(list(map(int, input())))
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
dfs(x-1, y)
dfs(x+1, y)
dfs(x, y-1)
dfs(x, y+1)
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)
4. ๋ฏธ๋ก ์ฐฐ์ถ
๋์ด๋ ์คํ
๋ฌธ์
๋๋น์ด๋ N*M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ํํ์ ๋ฏธ๋ก์ ๊ฐํ ์๋ค. ๋ฏธ๋ก์๋ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผ ํ๋ค. ๋๋น์ด์ ์์น๋ (1,1)์ด๊ณ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N,M)์ ์์ณ ์กด์ฌํ๋ฉฐ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ์ด๋ ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด ์๋ค. ๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋๋ค. ์ด๋ ๋๋น์ด๊ฐ ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ์์ค. ์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํ๋ค.
ํด์ค
์ด ๋ฌธ์ ๋ BFS๋ฅผ ์ด์ ์ฉํ์ ๋ ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. BFS๋ ์์ ์ง์ ์์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐจ๋ก๋๋ก ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ๋
from collections import deque
n, m = map(int, input().split())
graph = []
for i in range(n) :
graph.append(list(map(int, input())))
dx = [-1, 1, 0, 0]
dy = [ 0, 0, -1, 1]
def dfs(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 < 0 or ny < 0 or nx >= n 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]
print(bfs(0,0))