DFS & BFS
스택 & 큐 구현
스택(Stack)
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
stack.pop()
stack.pop()
print(stack)
결과 => [1, 2, 4]
💡 역순으로 정렬하기 => stack[::-1]
큐(Queue)
from collections import deque
queue = deque()
queue.append(3)
queue.append(5)
queue.append(2)
queue.popleft()
queue.append(1)
print(queue)
결과 => deque([2, 3, 4])
💡 역순으로 정렬하기 => queue.reverse()
깊이 우선 탐색(DFS)
- ```py graph = [ [], [2,3,8], [1,7], [1,4,5], [3,5], [3,4], [7], [2,6,8], [1,7], ]
visited = [False] * 9
def dfs(graph,v,visited): visited[v] = True for i in graph[v]: if not visited[i]: dfs(graph,i,visited)
dfs(graph,1,visited)
결과> 1->2->7->6->8->3->4->5
## DFS 문제 1. 얼음 얼려 먹기
문제 설명:
```py
ice_maker = []
n, m = map(int,input("크기: ").split())
for i in range(n):
ice_maker.append(list(map(int,input(f"{i+1}번줄: "))))
# DFS
result_dfs = 0
def iceAge_dfs(x,y):
if x<= -1 or x >= n or y<=-1 or y >= m:
return False
if ice_maker[x][y] == 0:
ice_maker[x][y] = 1
iceAge_dfs(x-1,y)
iceAge_dfs(x+1,y)
iceAge_dfs(x,y-1)
iceAge_dfs(x,y+1)
return True
return False
for i in range(n):
for j in range(m):
if iceAge_dfs(i,j) == True:
result_dfs +=1
print(result_dfs)
넓이 우선 탐색(BFS)
- 가까운 노드부터 우선적으로 탐색하는 알고리즘 ```py visited = [False] * 9
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
bfs(graph,1,visited) ``` 결과> 1->2->3->8->7->4->5->6
BFS 문제 1. 미로 탈출
문제 설명:
- N x M 크기의 직사각형 형태의 미로를 괴물을 피해 탈출해야 한다.
- 현재 위치는 (1,1)이고 미로의 출구는 (N,M)에 위치하며 한 칸씩 이동 가능하다.
- 괴물이 있는 부분은
0, 괴물이 없는 부분은1로 표시되어 있다.탈출하기 위한 최소 칸의 개수를 구하세요. ⚠️ 시작칸과 마지막 칸은 항상 1이다.
참고 이코테 2021