미로 탈출

최민수·2023년 2월 21일
0

알고리즘

목록 보기
2/94
from collections import deque

dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]


# 최단경로 파악
def bfs(maps, start, target):
    q = deque()
    start.append(1)
    q.append(start)

    visited = [[False for i in range(len(maps[0]))] for j in range(len(maps))]

    while(q):
        cur_row, cur_col, depth = q.popleft()
        visited[cur_row][cur_col] = True

        for dxx, dyy in zip(dx, dy):
            nxt_row = cur_row + dxx
            nxt_col = cur_col + dyy

            if nxt_row == target[0] and nxt_col == target[1]:
                return depth

            if nxt_row >= len(maps) or nxt_row < 0 or nxt_col >= len(maps[0]) or nxt_col < 0:
                continue

            if maps[nxt_row][nxt_col] != "X" and visited[nxt_row][nxt_col] == False:
                q.append((nxt_row, nxt_col, depth+1))
                visited[nxt_row][nxt_col] = True
                
    return -1


def solution(maps):
    answer = 0
    start, lever, exit = [], [], []

    # 시작, 레버, 출구 정보
    for idx1, items in enumerate(maps):
        for idx2, item in enumerate(items):
            if item == "S":
                start.extend([idx1, idx2])
            if item == "L":
                lever.extend([idx1, idx2])
            if item == "E":
                exit.extend([idx1, idx2])

    # 시작지점 -> 레버
    val1 = bfs(maps, start, lever)
    if val1 == -1:
        return -1
    answer += val1

    # 레버 -> 출구
    val2 = bfs(maps, lever, exit)
    if val2 == -1:
        return -1
    answer += val2

    return answer

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

profile
CS, 개발 공부기록 🌱

0개의 댓글