기록하는 습관

[백준] 2178 미로 탐색 (Python, BFS) 본문

알고리즘/[문제풀이] 백준

[백준] 2178 미로 탐색 (Python, BFS)

로그뉴 2021. 6. 6. 15:45

문제

www.acmicpc.net/problem/2178

 

코드

from collections import deque

n, m = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input())))

dx = [-1, 1, 0, 0] # 상, 하, 좌, 우
dy = [0, 0, -1, 1]

def bfs(x,y):
    q = deque()
    q.append((x,y))

    while q:
        x,y = q.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: # 가장자리 벽 pass
                continue
            if graph[nx][ny] == 0: # 0은 이동할 수 없기 때문에 pass
                continue
            if graph[nx][ny] == 1:
                graph[nx][ny] = graph[x][y] + 1
                q.append((nx,ny))

    return graph[n-1][m-1]

print(bfs(0,0))

 

풀이

  1. 방향벡터 dx, dy를 잡아준다.
  2. bfs 알고리즘을 이용.
    1. 시작: queue에 (0,0)을 담아주기
    2. queue가 빌 때까지 계속 pop을 해주며 조건에 맞으면 queue에 다시 append.
      1. 조건1: 가장자리(첫 번째 if문)는 continue
      2. 조건2: 0인 칸(두 번째 if문)은 continue
      3. 조건3: 1인 칸(세 번째 if문)이면 graph[x][y] + 1 해준 값을 넣기. (칸을 이동할 때마다 1씩 증가하므로)
  3. 다 돌고 나면 graph[n-1][m-1]을 return하기

'알고리즘 > [문제풀이] 백준' 카테고리의 다른 글

[백준] 13460 구슬 탈출 2  (0) 2021.06.13
[백준] 16932 모양 만들기  (0) 2021.06.12
[백준] 1068 트리  (0) 2021.06.02
[백준] 9934 완전 이진 트리  (0) 2021.05.30
[백준] 14425 문자열 집합  (0) 2021.05.23
Comments