DP - 등굣길(Lv.3)

jisu_log·2025년 8월 8일

알고리즘 문제풀이

목록 보기
72/105


  • 오른쪽(→)과 아래(↓) 이동만 허용하므로 총 이동 횟수는 항상 (n−1)+(m−1)로 고정됨!
  • dp[i][j]에 (0,0)에서 (i,j)까지 올 수 있는 최단 경로 개수를 저장
  • 물웅덩이 칸은 dp=-10으로 표시해 계산에서 제외
  • dp[i][j] = dp[i - 1][j] + dp[i][j - 1] (왼쪽과 위에서 내려오는 경우를 더해주면 됨)

- 항상 좌표 순서 주의하기 -> dp[y][x]

from collections import deque

MOD = 10 ** 9 + 7


def solution(m, n, puddles):
    answer = 0
    
    # 좌표를 0 기준으로 재설정
    dp = [[-1] * m for _ in range(n)]
    for puddle in puddles:
        # 좌표 순서 주의! dp[y][x] 순으로 해야 함!
        dp[puddle[1] - 1][puddle[0] - 1] = -10
        
    dp[0][0] = 1
    
    for i in range(n):
        for j in range(m):
            # 물웅덩이인 경우
            if dp[i][j] == -10:
                continue
            # 시작점인 경우
            if i == 0 and j == 0:
                continue
            
            sum = 0
            # 위에서 내려오는 경우
            if i - 1 >= 0 and dp[i - 1][j] != -10:
                sum += dp[i - 1][j]
            # 왼쪽에서 오는 경우
            if j - 1 >= 0 and dp[i][j - 1] != -10:
                sum += dp[i][j - 1]
            
            dp[i][j] = sum

    answer = dp[n - 1][m - 1]
        
    return answer % MOD

0개의 댓글