728x90
- Q31. 금광
n x m 크기의 금광이 있습니다. 금광은 1x1크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다. 이후에 m번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 합니다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하세요.
만약 다음과 같이 3x4 크기의 금광이 존재한다고 가정합시다.
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만큼의 금을 채굴할 수 있으며, 이때의 값이 최댓값입니다.
입력예시)
2 (테스트 케이스)
3 4 (n,m)
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#Q31 GOLD
import sys
sys.stdin = open("input.txt")
def gold(x, y):
global result
for i in range(3):
nx = x + dx[i]
ny = y + dy[i]
# 이동할 수 있는 경우
if nx >= 0 and nx < n and ny >= 0 and ny < m:
temp[nx][ny] = max(temp[nx][ny], graphs[nx][ny] + temp[x][y])
# 재귀적 실행
gold(nx, ny)
result = max(result, get_score())
return result
def get_score():
score = 0
for i in range(n):
score = max(score, temp[i][m - 1])
return score
t = int(input())
for test in range(t):
#맵 크기 받기
n,m = map(int,input().split())
#금광 정보 받기
array = list(map(int,input().split()))
#2차원 리스트 생성
graphs = [[0] * m for _ in range(n)]
temp = [[0] * m for _ in range(n)]
for i in range(n):
for j in range(m):
graphs[i][j] = (array[i*m+j])
temp[i][j] = (array[i*m+j])
#각각의 자리를 더할 temp생성
#갈 수 있는 모든 방향으로 이동
# 오른쪽위, 오른쪽, 오른쪽아래
dx = [-1,0,1]
dy = [1,1,1]
result = 0
for i in range(n):
gold(i,0)
print(result)
|
cs |
풀이: 다이나믹 프로그래밍에 있는 파트인데 dfs로 풀었다. dp로 풀려니깐 나한테는 바로 풀이방법이 떠오르지 않았다. 이게 백준이라면 시간복잡도를 미리 계산해보았을 텐데 아쉽다.
728x90
'코딩테스트 > 다이나믹 프로그래밍' 카테고리의 다른 글
[python] 백준 13904번: 과제 (0) | 2023.01.08 |
---|---|
<PART 3> Q33. 백준 14501번: 퇴사 (0) | 2022.11.17 |
<PART 3> Q32. 백준 1932번: 정수 삼각형 (0) | 2022.11.17 |
<PART 2> 다이나믹 프로그래밍 예제 (0) | 2022.11.07 |
<PART 2> 다이나믹 프로그래밍 (0) | 2022.11.07 |
댓글