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

Yoongja·2023년 11월 2일
# 벽 못 지나감
# 통로중 문 있음
# 레버 있는 칸으로 이동하여, 레버 당긴후 미로 빠져나가는 문으로 이동 => 레버를 반드시 먼저 거쳐야 한단 소리!
# 최대한 빠르게 미로 빠져나가는 시간 -> bfs

from collections import deque

def exit(start, exit, maps, map_x, map_y):
    visited = [[0 for _ in range(map_y)] for _ in range(map_x)]
    q = deque()
    x, y = start
    q.append((x,y,0))
    visited[x][y] = 1 # 처음 위치 방문 처리 -> start임
    # cnt = 0
    while q:
        x, y,cnt = q.popleft()
        if (x, y) == exit:
            return cnt
        for dx, dy in [[0,1],[0,-1],[1,0],[-1,0]]: # 상하좌우
            nx, ny = x + dx, y + dy # 다음 이동할 것
            if 0 <= nx < map_x and 0 <= ny < map_y and visited[nx][ny] == 0 and maps[nx][ny] != 'X':
                visited[nx][ny] = 1
                q.append((nx,ny,cnt + 1)) # 넣어주기 !
                # cnt += 1
    return -1 # 못찾았다는거
def solution(maps):
    map_x = len(maps)
    map_y = len(maps[0])
    answer = 0
    for x in range(len(maps)):
        for y in range(len(maps[x])):
            if maps[x][y] == 'S':
                start_x, start_y = x, y
            if maps[x][y] == 'L':
                levor_x, levor_y = x, y
            if maps[x][y] == 'E':
                exit_x, exit_y = x, y 
    visited = [[0 for _ in range(map_y)] for _ in range(map_x)]
    temp = exit((start_x,start_y),(levor_x,levor_y),maps,map_x,map_y)
    # print(visited)
    if temp == -1 :
        return -1
    else:
        answer += temp
    temp =  exit((levor_x,levor_y),(exit_x,exit_y),maps,map_x,map_y)
    if temp == -1:
        return -1
    else:
        answer += temp
    ## 헐 시작지점 끝지점을 주기 ㅋ.ㅋ.ㅋ.ㅋ.ㅋ 대박
    return answer

중간경로가 있을때는 cnt를 변수로 넣어주기 ! 한참 헤맸다 정말 ,,
머리로는 아는데, 코드로 얘를 어떻게 고치면 좋지 했는데 이리 간단할 수가 ㅎ.ㅎ
중간경로 있을땐 조심하기, 근데 걍 앞으로 cnt를 매개로 넣는 것도 좋은듯 ㅋ.ㅋ.ㅋ.ㅋ. 생각하기 귀찮자나 ~

profile
Belief in the possibility

0개의 댓글