BFS (너비 우선 탐색)


BFS란?

  • BFS는 탐색 시작점의 인접한 정점들을 먼저 모두 차례로 방문한 후에, 방문했던 정점을 시작으로 하여 다시 인접한 정점들을 차례로 방문하는 방식
  • 인접한 정점들에 대해 탐색을 한 후, 다시 BFS를 진행해야 하므로 Queue를 사용

  • DFS와는 달리, 최고 깊이 까지 간 후 돌아오는 것이 아니라, 인접한 모든 정점을 차례대로 방문하고 그 다음 높이의 노드에 반복
  • 그래프, 트리, 미로 등에서 활용가능함

BFS 코드

def bfs(v):                 # bfs 반복 코드
    Q.append(v)             # 일단, 시작점을 Q에 넣어준다.
    D[v] = 0                # D는 시작점 부터의 거리
    visited[v] = 1          # visited 방문 해주고
    while Q:                # Q가 빈 리스트가 될 때 까지
        v = Q.popleft()     # Q의 제일 앞인덱스를 뽑아준다.
        for w in G[v]:      # 노드가 갈 수 있는 곳
            if not visited[w]:  # 방문하지 않았다면
                Q.append(w)     # 그 노드를 Q에 append
                visited[w] = 1  # visited 방문하고
                D[w] = D[v] + 1 # 시작점 부터의 거리니까 D[v]에 +1
                P[w] = v        # 부모 저장
  • 일반적으로 위와 같이 진행

미로에서의 활용코드

[SWEA_미로1](SW Expert Academy)

def bfs(r, c):
    Q.append((r, c))                # 일단, Q에 시작의 인덱스를 튜플로 묶어서 넣어준다.
    visited[r][c] = 1               # visited방문하고
    while Q:                        # Q가 빈리스트가 될 때 까지
        r, c = Q.pop(0)             # 제일 앞의 원소 뽑아주고
        if maze[r][c] == 3:         # 도착한 경우 1을 return하고 종료
            return 1
        for dr, dc in [[1, 0], [0, 1], [-1, 0], [0, -1]]:   # 미로를 탐색
            nr, nc = r + dr, c + dc
            if maze[nr][nc] != 1 and visited[nr][nc] == 0 and 0 <= nr < 16 and 0 <= nc < 16:
                Q.append((nr, nc))
                visited[nr][nc] = 1
    return 0

for y in range(1, 11):
    tc = int(input())
    maze = [list(map(int, input())) for _ in range(16)]
    visited = [[0]*16 for _ in range(16)]
    Q = []

    sr, sc, er, ec = 0, 0, 0, 0
    for i in range(16):             # 시작점과 종료점을 잡아준다.
        for j in range(16):
            if maze[i][j] == 2:
                sr, sc = i, j
            elif maze[i][j] == 3:
                er, ec = i, j

    print(f'#{tc}', bfs(sr, sc))
  • 위의 코드를 활용해 이런 식으로 미로를 탐색할 수 있다.

'알고리즘 개념' 카테고리의 다른 글

Queue 큐 (파이썬)  (0) 2022.09.03
DFS (깊이 우선 탐색) (파이썬)  (0) 2022.09.03
Stack 스택 (파이썬)  (0) 2022.09.01
트리 순회 코드 (파이썬)  (0) 2022.08.28
2차원 리스트 지그재그 순회 (파이썬)  (0) 2022.08.21
복사했습니다!