bong-u/til

프로그래머스 - 미로 탈출 (L2)

수정일 : 2023-07-14

 1from collections import deque
 2
 3vx = [0, 0, -1, 1]
 4vy = [-1, 1, 0, 0]
 5
 6def bfs(maps, N, M, p1, p2):
 7    visited = [[False]*M for _ in range(N)]
 8    q = deque()
 9    q.append(list(p1)+[0])
10
11    while q:
12        curY, curX, cnt = q.popleft()
13
14        if p2 == (curY, curX):
15            return cnt
16
17        for i in range(4):
18            x = curX + vx[i]
19            y = curY + vy[i]
20            if 0 <= x < M and 0 <= y < N and not visited[y][x] and maps[y][x] != 'X':
21                visited[y][x] = True
22                q.append([y, x, cnt+1])
23    return -1
24
25def solution(maps):
26    answer = 0
27    N = len(maps)
28    M = len(maps[0])
29
30    sp = (0, 0)
31    lp = (0, 0)
32    ep = (0, 0)
33
34    for i in range(N):
35        for j in range(M):
36            if maps[i][j] == 'S':
37                sp = (i, j)
38            elif maps[i][j] == 'L':
39                lp = (i, j)
40            elif maps[i][j] == 'E':
41                ep = (i, j)
42
43    tmp = bfs(maps, N, M, sp, lp)
44    if tmp == -1:
45        return -1
46
47    answer += tmp
48
49    tmp = bfs(maps, N, M, lp, ep)
50    if tmp == -1:
51        return -1
52
53    answer += tmp
54
55    return answer

문제

  • 미로를 나타낸 문자열 배열 maps가 주어진다
  • S: 시작지점, E: 출구, L: 레버, O: 통로, X: 벽이라고 하자
  • 시작지점에서 출발해서 레버를 경유하여 출구까지 최단 거리를 구하라
  • 탈출이 불가능하면 -1을 반환하라
  • TC
    • input

      [“SOOOL”,“XXXXO”,“OOOOO”,“OXXXX”,“OOOOE”]

    • ouput

      16

해결방법

  • BFS로 시작지점 -> 레버, 레버 -> 출구 두 가지를 따로 구해서 더한다