[이것이 코딩테스트다] 금광

Turtle·2024년 9월 20일
0
post-thumbnail

🗃️문제 설명

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

만약 다음과 같이 3 x 4 크기의 금광이 존재한다고 가정합시다.

1 3 3 2
2 1 4 1
0 6 4 7

가장 왼쪽 위의 위치를 (1, 1), 가장 오른쪽 아래의 위치를 (n, m)이라고 할 때, 위 예시에서는 (2, 1) → (3, 2) → (3, 3) → (3, 4)의 위치로 이동하면 총 19만큼의 금을 채굴할 수 있으며, 이때의 값이 최댓값입니다.

첫째 줄에 테스트 케이스 T가 입력됩니다. (1 ≤ T ≤ 1000)
매 테스트 케이스 첫째 줄에 n과 m이 공백으로 구분되어 입력됩니다. (1 ≤ n, m ≤ 20)
둘째 줄에 n x m개의 위치에 매장된 금의 개수가 공백으로 구분되어 입력됩니다. (1 ≤ 각 위치에 매장된 금의 개수 ≤ 100)

테스트 케이스마다 채굴자가 얻을 수 있는 금의 최대 크기를 출력합니다.
각 테스트 케이스는 줄 바꿈을 이용해 구분합니다.

🖥️코드

import sys
input = sys.stdin.readline

T = int(input())
for _ in range(T):
    n, m = map(int, input().split())
    data = list(map(int, input().split()))
    dp = []

    idx = 0
    for i in range(n):
        dp.append(data[idx:idx+m])
        idx += m

    # 점화식
    for i in range(1, m):   # 가로
        for j in range(n):  # 세로
            if j == 0:      
                dp[j][i] += max(dp[j][i-1], dp[j+1][i-1])
            elif j == n - 1:
                dp[j][i] += max(dp[j][i-1], dp[j-1][i-1])
            else:
                dp[j][i] += max(dp[j][i-1], dp[j-1][i-1], dp[j+1][i-1])
    
    result = 0
    for i in range(n):
        result = max(dp[i][m-1], result)
    print(result)

🧠아이디어

알고리즘 유형 : 다이나믹 프로그래밍

오른쪽 위(↗), 오른쪽(→), 오른쪽 아래(↘) 방향으로 이동이 가능

맨 첫 번째 열의 어느 행에서든 출발이 가능하므로 1부터 시작하도록 설정
어떤 경로로 이동이 가능한지를 파악하고 점화식을 설계

🔒문제 출처 및 참고 코드

이것이 코딩테스트다 with 파이썬 - 금광
모범 답안 - 금광

0개의 댓글