[Python]알고리즘/백준

[DFS/BFS/완전탐색] ▲ 2178번 - 미로 탐색

HSY_mumu 2022. 3. 30. 22:26
728x90

[백준] 2178번 - 미로 탐색

풀이 시간: 30~40분 이내

 

1) 문제 해결 아이디어

이 문제는 시작 위치(1, 1)에서 도착 위치(N, M)으로 이동할 때 지나야 하는 최소의 칸 수를 구하는 문제다.

즉, 최단 경로를 구하는 문제로 BFS로 풀 수 있는 대표적인 문제이다.

BFS로 문제를 풀어야 한다는 것은 알았으나 방문 처리를 할 때 기록해야하는 값을 전역변수로 변경, 대입하여 약간의 어려움을 겪었다.

 

첫번째 오류. 최소 이동 칸 수를 구하기 위해 전역변수를 쓴 것

처음에 이동 칸 수를 나타낼 전역변수(res)를 선언하고 popleft()할 때마다 res 값을 1 증가했다.

상하좌우를 탐색할 때 갈 수 있는 칸이면 큐에 삽입하고 방문처리를 하는데 칸의 값을 res를 넣어주려고 했다. 그리고 마지막에 (n -1, m - 1) 위치의 값을 출력시키는 형태로 코드를 짰다.

하지만 이렇게 되면 pop할 때마다 res 값을 증가하는 꼴이므로 결국에 res값은 갈 수 있는 모든 칸 

즉, 미로에서 1인 칸의 개수가 된다.

 

BFS에서 최소 이동 칸 수를 구할 때

인접(상하좌우) 좌표의 값이 현재 좌표의 값에 1을 더한 값이 되어야 한다!!!

 

만약, 이전처럼 시작 좌표 기준으로 인접한 좌표들(그래프 전체 노드)의 개수를 구할 때는

전역변수를 선언하고 popleft() 할 때마다 그 값을 1씩 증가시키면된다!

 

2) 소스코드

from collections import deque

n, m = map(int, input().split())  # 목표 좌표
# 0: 이동 불가, 1: 이동 가능
graph = [list(map(int, input())) for _ in range(n)]

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

# BFS
def bfs(x, y): 
  # 시작 좌표 삽입, 방문 처리
  queue = deque()
  queue.append((x, y))
  graph[x][y] = 1  # 갈 수 없는 길로 변경

  while queue:
    x, y = queue.popleft()

    # 상하좌우 탐색
    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if(0 <= nx < n and 0 <= ny < m):
        # 갈 수 있는 길이면 삽입, 방문 처리
        if(graph[nx][ny] == 1):
          queue.append((nx, ny))
          graph[nx][ny] = graph[x][y] + 1 

bfs(0, 0)
print(graph[n-1][m-1])

[참고] https://jokerldg.github.io/algorithm/2021/03/24/maze.html

 

백준 2178번 미로 탐색 (python 파이썬) - Tech

백준 2178번 미로 탐색 (python 파이썬) March 24, 2021

jokerldg.github.io

 

728x90