Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 프로그래머스
- 백준12904
- 백준1339
- 백준16954
- 백준1788
- 빙산
- 파이썬
- 백준3190
- 경비원
- 백준1697
- 백준2573
- 키패드 누르기
- 백준5710
- 인구 이동
- 로또의 최고 순위와 최저 순위
- A와 B
- 단어 수학
- 124 나라의 숫자
- 코딩테스트
- 백준 2564
- Smart Commit
- 부스트캠프
- 소수 만들기
- 백준
- 피보나치 수의 확장
- 백준 14499
- 완주하지 못한 선수
- 움직이는 미로 탈출
- 전기 요금
- 백준16234
Archives
- Today
- Total
Today.dev
[Python] BFS(Breadth-First Search) / 너비우선탐색 본문
구현
1. 인접리스트로 표현된 그래프 BFS
from collections import deque
def bfs(n):
q = deque()
q.append(n)
visited = [False] * 9
while q:
n = q.popleft()
print(n, end=' ')
for i in graph[n]:
if not visited[i]:
q.append(i)
visited[i] = True
graph = [ # 각 노드가 연결된 정보를 2차원 리스트로 표현
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
활용
1. 2차원 리스트에서 출발 노드와 목표 노드 사이 최단 거리 구하기
# 5 X 5 배열
# start = (0, 0), end = (3, 4)
# 상하좌우 1칸씩 이동 가능
from collections import deque
def bfs(start, end):
q = deque()
q.append(start) # 시작 노드
visited = [[0 for _ in range(5)] for _ in range(5)] # 방문 처리 + 거리
x, y = start
visited[x][y] = 1 # 시작 노드 방문 처리
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < 5 and 0 <= ny < 5:
if visited[nx][ny] == 0: # 첫 방문
if (nx, ny) == end: # 목표 노드와 동일한가?
return visited[x][y]
visited[nx][ny] = visited[x][y] + 1
q.append((nx, ny)) # 다음에 방문할 노드로 등록
return -1 # start == end 인 경우 or 목표 노드의 범위가 옳지 않은 경우
장점
- 출발 노드에서 목표 노드까지의 최단 길이 경로를 보장한다.
단점
- DFS보다 많은 메모리를 사용한다.
'알고리즘 > 노트' 카테고리의 다른 글
[Python] 세그먼트 트리 (0) | 2021.08.25 |
---|---|
[Python] 비트 연산 (0) | 2021.06.23 |
Comments