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