프로그래머스(Python) 풀이/Level.2
프로그래머스(Python) 1844번 게임 맵 최단거리 풀이
개발윗미
2022. 5. 6. 10:51
Python으로 구현한 1844번 게임 맵 최단거리 문제 풀이입니다.
https://programmers.co.kr/learn/courses/30/lessons/1844
코딩테스트 연습 - 게임 맵 최단거리
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1
programmers.co.kr
from collections import deque
def bfs(arr, x, y) :
q = deque()
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
q.append((x, y))
while q :
cx, cy = q.popleft()
for i in range(4) :
nx = cx + dx[i]
ny = cy + dy[i]
if not (0 <= nx < len(arr) and 0 <= ny < len(arr[0])) :
continue
if arr[nx][ny] == 0 :
continue
if arr[nx][ny] == 1 :
arr[nx][ny] = arr[cx][cy] + 1
q.append((nx, ny))
return arr
def solution(maps) :
bfs(maps, 0, 0)
if maps[len(maps)-1][len(maps[0])-1] == 1 :
return -1
else :
return maps[len(maps)-1][len(maps[0])-1]
1. 최단거리를 구하는 bfs() 함수의 작업은 아래와 같다.
- 큐를 생성하여 전달받은 현재 좌표(0, 0)를 삽입하고, (동 남 서 북) 방향을 담은 dx, dy를 정의한다.
- 큐가 빌 때까지 큐에서 좌표를 꺼내고 해당 위치에서 인접한 네 칸의 좌표를 확인한다.
- 인접한 칸이 범위를 벗어나거나 벽(0)일 경우 continue를 수행한다.
- 인접한 칸이 길(1)일 경우 인접한 칸에 원래 좌표의 값에 1을 더하여 할당하고, 큐에 인접한 좌표를 삽입한다.
2. bfs() 함수를 통한 거리 갱신 작업을 마치면 게임 맵의 우측 하단(상대방 진영)을 확인하여 그 값이 1일 경우 갈 수 없으므로 -1을 반환하고, 그렇지 않다면 해당 위치의 값을 반환한다.