📌 문제
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다.
준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1), (r+1, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으로 나갈 수는 없다.
준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.
📌 입력
첫째 줄에 미로의 크기 N, M이 주어진다. (1 ≤ N, M ≤ 1,000)
둘째 줄부터 N개 줄에는 총 M개의 숫자가 주어지며, r번째 줄의 c번째 수는 (r, c)에 놓여져 있는 사탕의 개수이다. 사탕의 개수는 0보다 크거나 같고, 100보다 작거나 같다.
📌 출력
첫째 줄에 준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수를 출력한다.
📌 문제 풀이
👨🏫 접근
취중 알고리즘 풀이라서 쉬운 문제를 풀려고 합니다!
이 문제는 dp 기본적인 문제 중 하나입니다. 여기서 이동은 (1, 1) 에서 (n, m) 까지 (r, c + 1), (r + 1, c), (r + 1, c + 1)로 세 가지 이동만 고려하면 됩니다.
즉 세 가지 이동을 과거, 이동 후를 현재라고 했을 때, (r, c + 1), (r + 1, c), (r + 1, c + 1) 위치에서의 최댓값을 비교하여 최대인 지점을 현 지점의 스코어와 합산하는 것입니다.
👨🏫 문제 풀이
📄 전체 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [[0] * (m + 1) for _ in range(n + 1)]
d = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
graph[i][1:] = list(map(int, input().split()))
for i in range(1, n + 1):
for j in range(1, m + 1):
d[i][j] = graph[i][j] + max(d[i - 1][j], d[i][j - 1])
print(d[-1][-1])
📄 준비
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [[0] * (m + 1) for _ in range(n + 1)]
d = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
graph[i][1:] = list(map(int, input().split()))
이동할 수 없는 경우를 고려하여 n + 1, m + 1로 입력을 받아줍니다.
📄 풀이
for i in range(1, n + 1):
for j in range(1, m + 1):
d[i][j] = graph[i][j] + max(d[i - 1][j], d[i][j - 1])
print(d[-1][-1])
📌 총평
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Python - Dynamic Programming] 2225 합분해 (0) | 2022.09.27 |
---|---|
[Python - Dynamic Programming] 2482 색상환 (1) | 2022.09.25 |
[Python - Dynamic Programming] 11660 구간 합 구하기 5 (1) | 2022.09.23 |
[Python - Dynamic Programming] 9657 돌 게임 3 (1) | 2022.09.23 |
[Python - Dynamic Programming] 2011 암호코드 (0) | 2022.09.22 |