👨‍🏫ps/❄️프로그래머스

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

peacekim 2023. 5. 21. 20:21
반응형

문제

bfs로 풀면되는 문제이다.

출발점-> 레버 + 레버 -> 도착점 

두 합의 최소를 구하면 된다.

 

코드

from collections import deque
def solution(maps):
    answer = 0
    startDot, leverDot, endDot = None, None, None
    for i in range(len(maps)):
        for j in range(len(maps[i])):
            if maps[i][j] == "S":
                startDot = (i,j)
            elif maps[i][j] == "L":
                leverDot = (i,j)
            elif maps[i][j] == "E":
                endDot = (i,j)
            else:
                continue
                
    startToLever = bfs(maps,startDot, leverDot)
    if startToLever == -1:
        return -1
    leverToEnd = bfs(maps,leverDot, endDot)
    if leverToEnd == -1:
        return -1
    return startToLever + leverToEnd

def bfs(maps, start, end):
    (sR, sC) = start
    mC = [0,1,0,-1]
    mR = [1,0,-1,0]
    q = deque()
    q.append(Dot(sR,sC,0))
    s = set([start])
    while q: 
        cDot = q.popleft()
        if (cDot.r, cDot.c) == end:
            return cDot.cnt
        for i in range(4):
            nR, nC = mR[i] + cDot.r, mC[i] + cDot.c
            if nR < 0 or nR >= len(maps) or nC < 0 or nC >= len(maps[0]):
                continue
            if maps[nR][nC] == "X" or (nR, nC) in s:
                continue
            q.append(Dot(nR,nC,cDot.cnt+1))
            s.add((nR, nC))
    return -1
            
            
class Dot:
    def __init__(self, r, c, cnt):
        self.c = c
        self.r = r
        self.cnt = cnt
        
'''
레버를 당겨야지만 미로르 탈출 가능
탈출할 수 없으면 -1 반환
BFS로 하고, 레버를 지나고 마지막 지점에 도착하면 
갔던 곳 또 갈 수 있어야지
시작점부터, 레버까지 길이 구하고, 레버부터 시작점까지 길이 구하기
'''
반응형