본문 바로가기
Problem Solving

[DP] 미로 탈출

by Bokoo14 2022. 12. 14.
미로 A에서 출발점은 A[0][0]이며 도착점은 A[N-1][M-1]이라 하자.
미로의 각 지점 A[i][j]를 지나갈 때 해당 지점의 값을 통행세로 내야한다.
미로의 각 지점에서는 오른쪽이나 아래쪽으로만 이동이 가능하다.
N*M 크기의 미로에서 내야 하는 통행세의 최소값을 출력하시오.
Input
첫째 줄에 미로의 행과 열의 크기 N, M이 주어진다.
둘째 줄부터 N개의 줄에 각 셀의 통행세가 M개 주어진다.
3 5
1 1 1 1 1
1 2 2 2 4
1 1 4 1 1

5 3
1 2 3
4 5 6
7 8 9
1 2 3
5 2 1

Output
첫째 줄에 주어진 미로에서 내야 하는 통행세의 최솟값을 출력한다.
8

18
import sys
input=sys.stdin.readline

n, m = map(int, input().split())
maze=[list(map(int, input().split())) for _ in range(n)]

# dp table 통행세의 최소값 저장
dp=[[0]*m for _ in range(n)] 
print(dp)
# 오른쪽이나 아래쪽으로만 이동이 가능
def sol(n, m):
    for i in range(n):
        for j in range(m):
            if i==0 and j==0: # 초기값
                dp[i][j]=maze[i][j]
            elif i==0: # 오른쪽으로만 이동하는 경우
                dp[i][j]=maze[i][j]+dp[i][j-1]
            elif j==0: # 아래쪽으로만 이동하는 경우
                dp[i][j]=maze[i][j]+dp[i-1][j]
            else: # 오른쪽 or 왼쪽으로 이동 중 최소값 저장
               dp[i][j]=maze[i][j]+min(dp[i-1][j], dp[i][j-1])

sol(n, m)
print(dp[n-1][m-1])

'''
# 이동 경로를 알려면 ..
for i in range(n):
    print(dp[i])
'''

 

'Problem Solving' 카테고리의 다른 글

[DFS] 족보  (0) 2022.12.15
[DP] 하나가 되고 싶어  (0) 2022.12.14
[DP] 계단 오르기  (0) 2022.12.14
[DP] 이항 계수의 합  (0) 2022.12.14
[DP] 세보나치 수열  (0) 2022.12.14