Algorithm/Dynamic Programming

[Python] 금광

코딩쪼앙 2023. 2. 6. 21:12

문제

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

출력

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

입력 예시

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

출력 예시

19
16

문제 풀이

  • 금광의 모든 위치에 대해서 왼쪽위, 왼쪽, 왼쪽아래에서 오는 이 세 가지 경우에 대해서 최댓값을 구한 후, 현재까지 구한 값에 더한다.
  • 또한 테이블을 열 기준으로 탐색하고, 최댓값은 가장 오른쪽에있는 인덱스에 들어 있으므로, 가장 오른 쪽 열의 최댓값을 출력한다.

코드

for i in range(int(input())):
    n, m = map(int,input().split())
    data = list(map(int,input().split()))

    # 2차원 배열에 매핑
    index = 0
    gold = []
    for _ in range(n):
        gold.append(data[index:m+index])
        index += m
   # 탐색 (열 기준으로 탐색)
    for i in range(1, m):
        for j in range(n):
           #왼쪽 아래에서 오는 경우
            if j == n - 1:
                left_down = 0
            else:
                left_down = gold[j + 1][i - 1]
           #왼쪽 위에서 오는 경우 (맨 위에 있는 경우 탐색 불가)
            if j == 0:
                left_up = 0
            else:
                left_up = gold[j - 1][i - 1]
           #왼쪽에서 오는 경우 (가장 왼쪽에 있는 경우 불가)
            left = gold[j][i - 1]

            # 최댓값 계산
            gold[j][i] += max(left, left_up, left_down)

    # 최댓값 출력
    result = 0
    for i in range(n):
        result = max(result, gold[i][m - 1])

    print(result)

 

'Algorithm > Dynamic Programming' 카테고리의 다른 글

[Python] 효율적인 화폐 구성  (0) 2023.02.08
[Python] 바닥공사  (0) 2023.02.08
[Python] 정수 삼각형  (0) 2023.02.06
[Python] 1로 만들기  (0) 2023.02.06
[Python] 개미전사  (0) 2023.02.06