merona99 2022. 6. 19. 17:30
반응형

[Flipkart] 금광

다이나믹 프로그래밍

 

 

풀이 깃허브: https://github.com/tpqls0327/Algorithm/tree/master/Interviews

 

 

[문제]

 

n x m 크기의 금광이 있습니다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다.

채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다.

이후에 m - 1번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 합니다.

결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하세요.

 

 

[입력 조건]

1. 첫째 줄에 테스트 케이스 T가 입력됩니다. (1 <= T <= 1000)

 

2. 매 테스트 케이스 첫째 줄에 n과 m이 공백으로 구분되어 입력됩니다. (1 <= n, m <= 20)

   둘째 줄에 n x m개의 위치에 매장된 금의 개수가 공백으로 구분되어 입력됩니다. (1 <= 각 위치에 매장된 금의 개수 <= 100)

 

 

 

 

[과정]

 

  • 입력받은 만큼 반복 실행
    • 2차원 배열(arr)을 초기화
    • 다이나믹 수행:
      • 한번 반복문이 돌때마다 한 열을 전부 확인하여 왼쪽 위에서 오는 경우(1), 왼쪽에서 오는 경우(2), 왼쪽 아래에서 오는 경우(3)로 구분하여 계산
      • 세 개중 가장 큰 값을 해당 값(arr[i][j])을 갱신
    • 가장 오른쪽 열중에서 큰 값을 출력

 

 

 

 

[소스코드]

 

# 금광

t = int(input())

for _ in range(t):
    n,m = map(int, input().split())
    arr = []
    tmp = list(map(int, input().split()))

    for i in range(0,len(tmp), m):
        arr.append(tmp[i:i+m])

    for i in range(1, m):
        for j in range(n):
            if j == 0:
                left_up = 0
            else:
                left_up = arr[j-1][i-1]

            if j == n - 1:
                left_down = 0
            else:
                left_down = arr[j+1][i-1]

            left = arr[j][i-1]
            arr[j][i]  = arr[j][i] + max(left_up, left_down, left)
            
    result = 0
    for i in range(n):
        result = max(result, arr[i][m-1])
       
    print(result)

 

'이코테' 책을 참조하였음

 

반응형