Algorithm

[백준]2178. 미로탐색 - python

우주알 2023. 3. 13. 00:29

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

- 최단 경로를 찾는거니까 bfs 로 탐색

- 거리를 답으로 출력해야 하므로, 다음 이동할 칸을 찾아 큐에 담을 때 지금까지 온 거리에 +1을 한다

- 방문 표시를 위한 배열을 따로 만들어두고 방문하는 곳은 표시

- 방문한 적 없고 해당 좌표의 숫자가 1이면 (방문표시 하고 그 때까지의 거리를 기록하고, 큐에 담는다)

- 방문한 적 없고 해당 좌표가 N,M(배열 상으로는 N-1,M-1)이면 그 때까지의 거리를 기록하고, 그 값이 곧 답이 된다.

 

제출 코드>>

from collections import deque

N,M = map(int,input().split())
maze = [list(map(int,input())) for _ in range(N)]

S = (0,0)
E = (N-1,M-1)
visited = [[0]*M for _ in range(N)]  # 방문 기록할 곳
delta = [(1,0), (-1,0), (0,1), (0,-1)]  # 델타 이동 좌표
ans = 0  # 정답 초기화

visited[S[0]][S[1]] = 1 # 방문 표시
Q = deque([S])  # 큐에 담기

flag = True
while Q:  # 큐 있는 동안 계속 탐색

    now = Q.popleft()

    for k in range(4):
        ni = now[0] + delta[k][0]
        nj = now[1] + delta[k][1]  # 다음 좌표 생성
        if 0 <= ni < N and 0 <= nj < M and visited[ni][nj] == 0:  # 인덱스를 벗어나지 않고, 방문 안한 곳이면
            if (ni,nj) == E:  # 그 곳이 마지막 좌표이면
                maze[ni][nj] = maze[now[0]][now[1]] + 1 # 거리 기록해주고
                ans = maze[ni][nj]  # 그 값을 답에 할당한다
            elif maze[ni][nj] == 1:  # 그 곳이 이동할 수 있는 곳이면
                maze[ni][nj] = maze[now[0]][now[1]] + 1  # 거리 기록해주고
                visited[ni][nj] = 1  # 방문 표시도 해주고
                Q.append((ni,nj))  # 다음에 갈 곳이니까 큐에 담는다
        if ans:  # 답에 값이 생겼으면 반복문을 완전히 탈출 해야 한다
            flag = False
            break
    if flag == False:
        break

print(ans)

풀이과정>>