[ BOJ / Python ] 1937번 욕심쟁이 판다

황승환·2022년 7월 29일
0

Python

목록 보기
404/498


이번 문제는 다이나믹 프로그래밍을 통해 해결하였다. DFS를 통해 탐색해가며 dp리스트에 메모라이제이션한 값을 이용하였다.

처음에는 dp[i][j]에 (i, j)가 최대 몇번째 방문 대나무인지에 대한 값을 저장하도록 하였다. 그러나 이 방법은 시간초과가 발생하였다. 다른 풀이에 대해 생각하였고, (i, j)에서 가장 많이 갈 수 있는 대나무의 수를 dp[i][j]에 저장하기로 하였다. 이 방식으로 접근하자 시간초과가 발생하지 않았고, 해결할 수 있었다.

Code

처음 코드 (시간초과)

import sys
sys.setrecursionlimit(10**6)
n = int(input())
bamboo = [list(map(int, input().split())) for _ in range(n)]
dp = [[1 for _ in range(n)] for _ in range(n)]
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
def find_max(y, x):
    for i in range(4):
        ny, nx = y+dy[i], x+dx[i]
        if 0 <= ny < n and 0 <= nx < n:
            if bamboo[ny][nx] > bamboo[y][x] and dp[ny][nx] < dp[y][x]+1:
                dp[ny][nx] = dp[y][x]+1
                find_max(ny, nx)
for i in range(n):
    for j in range(n):
        if dp[i][j] == 1:
            find_max(i, j)
answer = 0
for i in range(n):
    answer = max(answer, max(dp[i]))
print(answer)

정답 코드

import sys
sys.setrecursionlimit(10**6)
n = int(input())
bamboo = [list(map(int, input().split())) for _ in range(n)]
dp = [[-1 for _ in range(n)] for _ in range(n)]
dy, dx = [0, 1, 0, -1], [1, 0, -1, 0]
def find_max(y, x):
    if dp[y][x] == -1:
        dp[y][x] += 1
        for i in range(4):
            ny, nx = y+dy[i], x+dx[i]
            if 0 <= ny < n and 0 <= nx < n and bamboo[ny][nx] > bamboo[y][x]:
                dp[y][x] = max(dp[y][x], find_max(ny, nx))
    return dp[y][x]+1
answer = 0
for i in range(n):
    for j in range(n):
        answer = max(answer, find_max(i, j))
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글