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
- 파이썬컨벤션
- dfs
- __name__
- heapq
- 우선순위큐
- 단지번호붙이기
- 파이썬스럽게
- major gc
- 화살표함수
- 삼성소프트웨어
- 이코테
- React
- addAttribute
- SWEA
- setviewname
- MSSQL
- WebMvcConfigurer
- Spring
- 2178
- 백준
- 2667
- minmax
- 음료수얼려먹기
- pep8
- 2606
- Arecode
- 미로탐색
- JWT
- BFS
- 미로탈출
Archives
- Today
- Total
하루하루는 성실하게 인생 전체는 되는대로
BFS - 미로 탈출 본문
from collections import deque
n, m = map(int, input().split())
result = 0
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):
que = deque()
#첫 번째 노드를 큐에 넣기
que.append((x,y))
#큐가 빌 때까지 실행
while que:
#큐의 맨 첫번째 요소를 큐에서 빼서 x, y에 담기
x,y=que.popleft()
for i in range(4):
#해당 노드의 상하좌우에 노드 존재하는지 살피기
nx=x+dx[i]
ny=y+dy[i]
#범위 벗어나면 무시
if nx<0 or nx>=n or ny<0 or ny>=m:
continue
#1아니고 0이면 무시
if graph[nx][ny]==0:
continue
#1이면 이전 노드의 값에 1 더한 값을 넣어주기
if graph[nx][ny]==1:
graph[nx][ny]=graph[x][y]+1
#이 노드를 큐에 넣기
que.append((nx,ny))
#1인 노드가 더이상 존재하지 않으면, 큐에서 빼기만 하므로 큐가 비게 됨.
return graph[n-1][m-1]
# 맨 위 첫 번째 노드에서 시작해서 이어나가기 때문에
# 0,0 한번만 넣어줌.
print(bfs(0, 0))
풀이 포인트!!
- 0,0 노드에서 시작한다 ⇒ 함수에 0,0만 한번 대입
- while que 돌리기 전에, 초기 위치 노드를 큐에 넣고 시작한다
- while문 안에서, 큐의 첫 번째 요소를 제거하여 현재 위치 노드로 삼는다
- 현재 노드에서 상하좌우 살펴서, 1인 노드에만 "현재노드값+1" 해주고, 이 위치 노드들을 모두 큐에 넣어준다
- 큐가 빌 때까지 위 과정 반복한다
⇒ 1인 노드가 더이상 존재하지 않으면, 큐에서 제거되기만 하므로, 큐가 텅 비게 됨.
'알고리즘 Archive' 카테고리의 다른 글
[백준] 2667 - 단지번호붙이기 (0) | 2021.03.24 |
---|---|
[백준] 1260 - dfs와 bfs (미완-다시풀기) (0) | 2021.03.24 |
DFS - 음료수 얼려 먹기 (0) | 2021.03.24 |
[백준] 2750 - 수 정렬 (0) | 2021.03.24 |
[백준] 1920 - 수 찾기 (0) | 2021.03.24 |
Comments