본문 바로가기

PS

프로그래머스 159993 Python [미로 탈출]

from collections import deque

def solution(maps):
    n, m = len(maps), len(maps[0])
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    start = lever = exit_pos = None
    for x in range(n):
        for y in range(m):
            if maps[x][y] == 'S':
                start = (x, y)
            elif maps[x][y] == 'L':
                lever = (x, y)
            elif maps[x][y] == 'E':
                exit_pos = (x, y)
    
    def bfs(x, y, target_pos):
        queue = deque([(x, y, 0)])
        visited = [[False] * m for _ in range(n)]
        visited[x][y] = True
        while queue:
            x, y, dist = queue.popleft()
            if (x, y) == target_pos:
                return dist
            
            for k in range(4):
                nx, ny = x + dx[k], y + dy[k]
                if 0 <= nx < n and 0 <= ny < m:
                    if not visited[nx][ny] and maps[nx][ny] != 'X':
                        visited[nx][ny] = True
                        queue.append((nx, ny, dist + 1))
        return -1
    dist_to_lever = bfs(start[0], start[1], lever)
    if dist_to_lever == -1:
        return -1
    dist_to_exit = bfs(lever[0], lever[1], exit_pos)
    if dist_to_exit == -1:
        return -1
    
    answer = dist_to_lever + dist_to_exit
    return answer