728x90
반응형
백준 욕심쟁이 판다 파이썬 문제풀이
14 9 12 10
1 11 5 4
7 15 2 13
6 3 16 8
위의 4x4가 있다고 할 때 어떤 지점에 판다를 놓으면 더 큰 숫자가 있는 방향으로만 이동할 수 있다.
nxn에서 탐색한 칸이 최대가 되는 경로와 그 값을 찾는 것인데
상당히 어려워서 더 연습이 필요할 것 같다.
정답 코드
n = int(input())
forest = [list(map(int,input().split())) for _ in range(n)]
dp = [[0] * n for _ in range(n)]
def recur(y,x):
if dp[y][x] != 0:
return dp[y][x]
for dy, dx in [[1,0],[-1,0],[0,1],[0,-1]]:
# for dy, dx in [[0,1],[0,-1],[1,0],[-1,0]]:
ey = y + dy
ex = x + dx
if 0 <= ey < n and 0 <= ex < n:
if forest[y][x] < forest[ey][ex]:
dp[y][x] = max(dp[y][x], recur(ey,ex) + 1)
return dp[y][x]
for j in range(n):
for i in range(n):
recur(j,i)
print(max(max(row) for row in dp) + 1)
일단 재귀를 이용해서 모든 칸에 대해서 탐색한다.
재귀 안에서는 상하좌우 4방향에 대해 움직인다.
주어진 칸 범위를 벗어나지 않아야하고
움직일 곳의 숫자가 더 커야한다.
현재 칸의 dp값과 / 움직일 곳으로 쭉 움직여서 얻은 최종 이동수 + 1
이 두 개 중 큰 값을 현재 dp에 저장한다.
여기가 어려운데, recur로 움직일 곳이 또 다음 움직일 횟수에 대해서
더 갈 곳이 없을 때까지 탐색하고 돌아오는 것이다.
즉 끝까지 간 결과와 현재 dp중 더 큰 값을 dp에 넣어서 최대값을 넣는 것.
주석처리된 for문을 사용하고 원래것을 지우면 탐색 순서만 바뀌는 건데
주석의 코드로 변경하면 런타임 에러가 뜬다.. 이건 왜그런지 모르겠다.
이번 문제는 어렵다.. 꼭 다시 풀어봐야겠다.
728x90
반응형
'개발 · 컴퓨터공학 > 알고리즘' 카테고리의 다른 글
백준 11053 가장 긴 증가하는 부분 수열 파이썬 문제풀이 (python LIS, LCS) (6) | 2024.10.14 |
---|---|
백준 1520 내리막길 파이썬 문제풀이 (python 2차원 DP) (4) | 2024.10.13 |
백준 1149 RGB거리 파이썬 문제풀이 (python 바텀업 DP) (6) | 2024.10.11 |
백준 11726 2×n 타일링 파이썬 문제풀이 (python 바텀업 DP) (5) | 2024.10.10 |
백준 12865 평범한 배낭 파이썬 문제풀이 (python 바텀업 DP) (2) | 2024.10.07 |