Algorithm/📊 Problem Solving

[이코테] 금광

posted by sangmin
출처 - 이것이 취업을 위한 코딩테스트다 with 파이썬

금광

📌 문제

n X m 크기의 금광이 있다. 금광은 1 X 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작한다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있다. 이후에 m번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 한다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하라.

📋 코드

T = int(input())
for _ in range(T):
    N, M = map(int, input().split())
    tmp = list(map(int, input().split()))

    gold = []
    idx = 0
    for _ in range(N):
        gold.append(tmp[idx:idx+M])
        idx += M

    for j in range(1, M):
        for i in range(N):
            if i == 0:
                gold[i][j] = max(gold[i][j-1] + gold[i][j], gold[i+1][j-1] + gold[i][j])
            elif i == N-1:
                gold[i][j] = max(gold[i-1][j-1] + gold[i][j], gold[i][j-1] + gold[i][j])
            else:
                gold[i][j] = max(gold[i-1][j-1] + gold[i][j], gold[i][j-1] + gold[i][j], gold[i+1][j-1] + gold[i][j])

    result = 0
    for g in gold:
        result = max(result, max(g))
    print(result)

💡 한마디

DP 테이블을 따로 만들어주지 않고 gold 리스트를 갱신해가며 풀었다.

맨 위 행은 왼쪽이나 왼쪽 아래에서 도달할 수 있고, 맨 아래 행은 왼쪽 위나 왼쪽에서 도달할 수 있다. 그 외에는 왼쪽 위, 왼쪽, 왼쪽 아래 3가지 위치에서 도달할 수 있기 때문에 각각의 경우에 대한 최댓값을 계속 갱신해나갔다.