우노
[DP] 이코테 “금광” Python 풀이 본문
문제
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)
출력 조건
- 테스트 케이스마다 채굴자가 얻을 수 있는 금의 최대 크기를 출력합니다.
- 각 테스트 케이스는 줄 바꿈을 이용해 구분합니다.
입력 예시
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
풀이
이 문제는 2차원 테이블을 이용한 다이나믹 프로그래밍으로 해결할 수 있다.
금광의 모든 위치에 대하여, 3가지 경우(왼쪽 위에서 오는 경우, 왼쪽 아래에서 오는 경우, 왼쪽에서 오는 경우)를 비교하고,
왼쪽에서의 가장 많은 금을, 현재 위치의 금에 더해줌으로써 문제를 해결할 수 있다.
이러한 과정을 점화식으로 표현하면 아래와 같다.
dp[i][j] += max(dp[i-1][j-1], dp[i][j-1], dp[i+1][j-1])
추가적으로, dp 테이블은 열 기준으로 탐색해야하며,
dp 테이블에 접근할 때마다 리스트의 범위를 벗어나지 않는지 체크할 필요가 있다.
예제 코드
import sys
# 테스트 케이스 입력
t = int(sys.stdin.readline())
for _ in range(t):
# 금광 정보 입력
n, m = map(int, sys.stdin.readline().split())
gold_input = list(map(int, sys.stdin.readline().split()))
# 다이나믹 프로그래밍을 위한 2차원 DP 테이블 초기화
gold = []
for i in range(n):
gold.append(gold_input[i*m:i*m+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+1][j-1])
# 왼쪽 아래가 없다면
elif ( i == n - 1):
gold[i][j] += max(gold[i-1][j-1], gold[i][j-1])
# 왼쪽 위와 왼쪽 아래가 다 있다면
else:
gold[i][j] += max(gold[i-1][j-1], gold[i][j-1], gold[i+1][j-1])
# 채굴자가 얻을 수 있는 금의 최대 크기 비교
result = 0
for i in range(n):
result = max(result, gold[i][m - 1])
print(result)
참고
- 이것이 취업을 위한 코딩 테스트다. with python
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[DP] 이코테 “퇴사” Python 풀이 (0) | 2022.09.19 |
---|---|
[DP] 이코테 “정수 삼각형” Python 풀이 (0) | 2022.09.19 |
[DP] 이코테 “효율적인 화폐 구성” Python 풀이 (0) | 2022.06.16 |
[DP] 이코테 “바닥 공사” Python 풀이 (0) | 2022.06.16 |
[DP] 이코테 “개미 전사” Python 풀이 (0) | 2022.06.12 |
Comments