728x90

백준 11048 - 이동하기

시간 제한 1초, 메모리 제한 256MB

# 조건

  • 준규는 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)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.

# 접근 방법

  • 딱 보자마자 시간 초과를 안 당하기 위해서는 dp로 접근해야 겠다고 생각하였다.
  • 우선 입력받은 arr을 now_val이라는 함수에 첫 행과, 첫 열에 대해서만 누적합을 구해준다.
  • 이후, (1, 1)부터 시작하여 now_val을 갱신해나가면 된다.
    • 이동할 수 있는 방법은 3가지 이지만, 대각선 이동의 경우 오른쪽 이동과 아래로 이동과 중복되는 값이므로 제외해주고 계산하였다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline


N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
now_val = [[0] * M for _ in range(N)]
now_val[0][0] = arr[0][0]
for i in range(1, M):
    now_val[0][i] = now_val[0][i-1] + arr[0][i]

for j in range(1, N):
    now_val[j][0] = now_val[j-1][0] + arr[j][0]

for i in range(1, N):
    for j in range(1, M):
        now_val[i][j] = max(now_val[i-1][j], now_val[i][j-1]) + arr[i][j]

print(now_val[N-1][M-1])
728x90