시간초과
import copy
mincnt = 100001
def solution(maps):
direction = [[0,1],[0,-1],[1,0],[-1,0]]
n, m = len(maps), len(maps[0])
if maps[n-2][m-1] ==0 and (m>1 and maps[n-1][m-2]==0) :
#본 위치에서 하나 위 and 본위치에서 하나 왼쪽
return -1
cnt = 0
visited = copy.deepcopy(maps)
def move(i,j, visited,cnt):
global mincnt
if i<0 or i>=n or j<0 or j>=m: return
if visited[i][j] == 0 or visited[i][j] == 2: return
cnt+=1
if i==n-1 and j==m-1:
if cnt<mincnt : mincnt=cnt
return
visited[i][j]=2 #방문했다면 2
if j<m-1: move(i,j+1,visited,cnt)
if j > 0 : move(i,j-1,visited,cnt)
if i<n-1: move(i+1,j,visited,cnt)
if i >0 :move(i-1,j,visited,cnt)
move(0,0,visited,cnt)
print(mincnt)
return mincnt
DFS를 사용하면 도착점 도착까지 가능한 경우에 대해 너무 많은 호출 발생.
import copy
from collections import deque
mincnt = 100001
def solution(maps):
global mincnt
n, m = len(maps), len(maps[0])
if maps[n-2][m-1] ==0 and (m>1 and maps[n-1][m-2]==0) :
# 본 위치에서 하나 위 and 본위치에서 하나 왼쪽
# 첫번째 예외 처리, 전체 예외처리는 마지막에 한번 더
return -1
queue = deque([[0,0,1]])
while queue:
i,j,cnt = queue.popleft()
if i==n-1 and j==m-1:
mincnt = min(mincnt, cnt)
break
if maps[i][j] != 1:
continue
maps[i][j] = 2
if j<m-1: queue.append([i,j+1,cnt+1])
if j > 0 : queue.append([i,j-1,cnt+1])
if i<n-1: queue.append([i+1,j,cnt+1])
if i >0 :queue.append([i-1,j,cnt+1])
if mincnt == 100001 : #도착점에 도착하지 못했다면 mincnt를 갱신하지 못했을 것이므로
return -1
return mincnt
from collections import deque
>기본 구현 코드
queue = deque()
queue = deque([]) #초기 값을 줄땐 배열에 담아서
while queue: #queue가 비어있지 않는 한 계속
q = queue.popleft()
if not visited q: # 방문하지 않은 노드라면,
# 작업