첫번째행부터 자신의 위에서 나올 수 있는 최대값에 자신을 더하는 방식으로 문제를 풀어나갔다.
0번째열이라면 dp[i-1][j]+자기자신이 답이니 바로 저장하고
열값이 0보다 크다면 dp[i-1][j-1]과 dp[i-1][j]중 더 큰 값에 자기자신을 더한 걸 dp테이블에 저장하도록 했다.
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
dp = [[0]*n for _ in range(n)]
dp[0][0] = arr[0][0]
# 1부터 n-1행까지
for i in range(1,n):
# 0 부터 i까지
for j in range(i+1):
# 0번째 열이면
if j ==0:
dp[i][j]=dp[i-1][j]+arr[i][j]
else:
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+arr[i][j]
# 마지막 행 중 가장 큰 값이 최대값이 됨
print(max(dp[n-1]))
내 풀이가 그렇게 매끄럽진 않은 것 같아서 다른 풀이를 참고해봤다.
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
for i in range(n-1, 0, -1):
for j in range(i):
arr[i-1][j] += max(arr[i][j],arr[i][j+1])
print(arr)
dp테이블을 따로 만들지 않고 삼각형값을 입력받은 리스트를 그대로 사용해서
메모리도 절약되고 코드도 짧아졌다.
무엇보다 반복문 조건도 더 직관적이고 깔끔해져서 이해하기 쉬워졌다.
정말 문제에서 요구한 대로 풀어낸 간단한 코드인데 왜 떠올리기가 어려웠을까?
아직 갈 길이 멀다
'[BOJ] - Python' 카테고리의 다른 글
[백준] 2156 : 포도주 시식 python (0) | 2023.10.01 |
---|---|
[백준] 14002 : 가장 긴 증가하는 부분 수열 4 python (0) | 2023.09.29 |
[백준] 12865 : 평범한 배낭 python (0) | 2023.09.28 |
[백준] 1149 : RGB거리 python (1) | 2023.09.28 |
[백준] 24416 : 알고리즘 수업 - 피보나치 수 1 (0) | 2023.09.28 |