[Algorithm] 알고리즘 정리(3)- DFS,BFS 알고리즘
DFS,BFS 알고리즘
- 탐색: 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
- 자료구조: 데이터를 관리하고 처리하기 위한 구조
- 스택: 선입후출, 파이썬에서 list로 표현
- 큐: 선입선출
파이썬에서 from collections import deque - 재귀 함수: 자기자신을 다시 호출
- DFS: 깊이 우선 탐색으로 그래프에서 깊은 부분을 우선적으로 탐색
프로그래밍에서 그래프 표현 방법
- 인접행렬: 2차원 배열로 그래프의 연결 관계를 표현
- 인접리스트: 리스트로 그래프의 연결 관계를 표현(그래프간의 비용을 의미) 0이 1과 7만큼 연결되어있고 2와는 5만큼 연결되어있다고 하면
- 인접리스트의 경우
graph[[] for _ in range(2)]
graph[0].append([1, 7])
graph[0].append([2, 5])
graph[1].append([0, 7])
graph[2].append([0, 5])
- BFS: 너비 우선 탐색으로 가까운 노드부터 탐색
DFS, BFS 알고리즘의 예시
DFS는 스택에 재귀함수를 사용하고
BFS는 큐를 사용한다.
문제
1.음료수 얼려먹기
NxM의 얼음틀이 있는데 구멍이 뚫린부분이 0 칸막이부분은 1로 할경우
상하좌우가 붙어있으면 연결되어있다고 할때 생성되는 총 아이스크림의 개수를 구하라.
1-1.내가 푼 답(못풀었음)
n, m = map(int, input().split())
ice = [list(map(int, input().split())) _ in range(n)]
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, y - 1)
dfs(x + 1, y)
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)
1-3.답안 예시와 내가 푼 답의 차이점
일단 내가 그래프에 대해서 아직 덜 공부했다는게 느껴지고
보충해서 나중에 답을 안보고 다시 풀어야겠다.
2.미로탈출
NxM크기의 미로가 있다.
괴물이 있는곳은 0 없는 곳을 1로 할경우 탈출 하기 위한 최소칸의 미로 칸의 개수를 구하라.
2-1.내가 푼 답
from collections import deque
n, m = map(int, input().split())
maze = [list(map(int, input())) for _ in range(n)]
d = [(1, 0), (-1, 0), (0, 1), (0, -1)]
q = deque()
q.append((0, 0))
def bfs():
while q:
x, y = q.popleft()
for k in range(4):
dx = x + d[k][0]
dy = y + d[k][1]
if 0 <= dx < n and 0 <= dy < m:
if maze[dx][dy] == 1:
maze[dx][dy] = maze[x][y] + 1
q.append((dx, dy))
maze[0][0] = 1
bfs()
print(maze[n-1])
2-2.답안 예시
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 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 < 0 or ny < 0 or nx >= n or ny >= m:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx, ny))
return graph[n - 1][m - 1]
print(bfs(0, 0))
2-3.답안 예시와 내가 푼 답의 차이점
아직까지는 그래프가 익숙하지 않아 조금 보고 풀었는데 이것 역시 다시 한번 나중에 풀어야겠다.
댓글남기기