본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 1937번: 욕심쟁이 판다 -Python

728x90

[백준알고리즘] 1937번: 욕심쟁이 판다 -Python

https://www.acmicpc.net/problem/1937

 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-) 이

www.acmicpc.net

재귀를 사용한 동적 계획법으로 문제를 풀었다.

 

시작점이 주어지지 않았기 때문에 각각의 지점이 시작점일 때 가장 오래 생존할 수 있는 일수를 구해야 한다.

 

리스트 visited에서는 각 지점을 방문했을 때를 포함해 앞으로 며칠을 더 살 수 있는지를 저장해놓는다. 이후 경로는 생각하지 않아도 최대 일수만 유지하고 있으면 된다.

from sys import setrecursionlimit
setrecursionlimit(10**9)

def dfs(i, j):
    if visited[i][j] < 0:
        visited[i][j] = 0
        for d in range(4):
            x, y = i+dx[d], j+dy[d]
            if 0<=x<n and 0<=y<n and forest[i][j] < forest[x][y]:
                visited[i][j] = max(visited[i][j], dfs(x, y))
        visited[i][j] += 1
    return visited[i][j]

n = int(input())
forest = [list(map(int, input().split())) for _ in range(n)]
visited = [[-1] * n for _ in range(n)]
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

ans = 0
for i in range(n):
    for j in range(n):
        ans = max(ans, dfs(i, j))
print(ans)

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90