등굣길
문제
웅덩이를 피해 학교에 가는 최단 거리의 경로 개수를 구하기
풀이
from collections import deque
def solution(m,n, puddles):
dist = [[0]*m for _ in range(n)]
# 시작점
dist[0][0] = 1
# 물웅덩이
for x, y in puddles:
dist[y-1][x-1] = -1
# queue 설정
queue = deque([(0,0)])
# 유효한지 확인하기
def isValid(x,y):
if 0<=x<m and 0<=y<n and dist[y][x] != -1:
return True
return False
# 돌기
while queue:
x, y = queue.popleft()
#물웅덩이 피해가기
if dist[y][x] == -1 :
continue
for dx, dy in [(0,1), (1,0)]:
nx, ny = x+ dx, y+ dy
if isValid(nx,ny):
if dist[ny][nx] == 0:
queue.append((nx,ny))
dist[ny][nx] += dist[y][x]
dist[ny][nx] %= 1000000007
return dist[n-1][m-1]
알게된 점
- 어떤걸 초기화해서 기록할지를 정해야한다. 거리를 기록할건지(dist), 방문 여부를 기록할건지(visited)
- 큐에서 뽑아서 쓰는 dfs의 경우에 큐 자체가 이터러블 하기 위해서 리스트 안에 튜플을 넣어줘야 한다!!! => non-iterable 오류남
- 그리드의 경우에 x,y로 표현되지 않고 y,x로 표현되는 경우도 있기 때문에 예시를 잘 봐야 한다.
- 시간 효율 문제가 나는 경우에는 큰수를 방지해 주는걸 붙여보자. 이거 하나로 갈린다.
Leave a comment