Algorithm/📊 Problem Solving

[백준/BOJ] 2169 - 로봇 조종하기

posted by sangmin

2169 - 로봇 조종하기

📌 문제

NASA에서는 화성 탐사를 위해 화성에 무선 조종 로봇을 보냈다. 실제 화성의 모습은 굉장히 복잡하지만, 로봇의 메모리가 얼마 안 되기 때문에 지형을 N×M 배열로 단순화 하여 생각하기로 한다.

지형의 고저차의 특성상, 로봇은 움직일 때 배열에서 왼쪽, 오른쪽, 아래쪽으로 이동할 수 있지만, 위쪽으로는 이동할 수 없다. 또한 한 번 탐사한 지역(배열에서 하나의 칸)은 탐사하지 않기로 한다.

각각의 지역은 탐사 가치가 있는데, 로봇을 배열의 왼쪽 위 (1, 1)에서 출발시켜 오른쪽 아래 (N, M)으로 보내려고 한다. 이때, 위의 조건을 만족하면서, 탐사한 지역들의 가치의 합이 최대가 되도록 하는 프로그램을 작성하시오.

📋 코드

N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]

dp = [[[-int(1e9) for _ in range(M+2)] for _ in range(N+1)] for _ in range(3)]
dp[0][1][0], dp[1][1][0], dp[2][1][0] = 0, 0, 0

for i in range(1, M+1):
    for k in range(3):
        dp[k][1][i] = dp[k][1][i-1] + graph[0][i-1]

for i in range(2, N+1):
    for j in range(1, M+1):
        dp[0][i][j] = max(dp[0][i][j], dp[0][i-1][j] + graph[i-1][j-1], dp[0][i][j-1] + graph[i-1][j-1])
    for j in range(M, -1, -1):
        dp[1][i][j] = max(dp[1][i][j], dp[1][i-1][j] + graph[i-1][j-1], dp[1][i][j+1] + graph[i-1][j-1])

    for j in range(1, M+1):
        dp[2][i][j] = max(dp[0][i][j], dp[1][i][j])

    dp[0][i] = dp[2][i]
    dp[1][i] = dp[2][i]

print(dp[2][N][M])

💡 한마디

3차원 DP 테이블을 만들어 dp[0][i][j]는 왼쪽에서 오른쪽으로, dp[1][i][j]는 오른쪽에서 왼쪽으로 로봇이 움직이며 가치의 합을 구했다. 그 후 dp[2][i][j]에 둘 중 더 큰 값을 넣어가며 답을 도출했다.

 

2169번: 로봇 조종하기

첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.

www.acmicpc.net