[프로그래머스] 정수 삼각형
[프로그래머스] 정수 삼각형
문제
링크 : 프로그래머스
풀이
이 문제는 현재 위치에서 좌 우 아래로 내려가면서 수를 더할 때, 최대 값을 구하는 문제이다.
먼저, 이 문제를 탐색을 활용해서 풀수 있으나 높이가 500까지 가고, 정수 값 또한 9999 이하의 정수이기 때문에
연산 과정이 많아질 것 같았다.
그래서 메모이제이션을 이용한 dp 방법을 이용했다.
현재 층에서 첫째 번과 가장 끝 번은 자신의 바로 위에 결과값과 현재 자신의 값으로 이루어져 있다.
그 이 외의 값들은 각 위 층의 좌, 우 번째 값들의 최대 값을 더해준다.
점화식으로 나타내면, 다음과 같다.
if k == 0 or k == len(dp[i])
dp[i][0] = dp[i-1][0] + a[i][0]
dp[i][n-1] = dp[i-1][n-2] + a[i][n-2]
else
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + a[i][j]
위의 점화식을 코드로 옮기면 다음과 같다.
def solution(triangle):
answer = 0
dp = []
for i in range(len(triangle)):
dp.append([0] * (i+1))
dp[0][0] = triangle[0][0]
for i in range(1, len(dp)):
for j in range(len(dp[i])):
if j == 0:
dp[i][j] = dp[i-1][j] + triangle[i][j]
elif j == len(dp[i]) - 1:
dp[i][j] = dp[i-1][j-1] + triangle[i][j]
else:
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
return max(dp[len(dp) - 1])
실수 및 배운 점
- 맞혔지만, 실수했던 것을 못봤던 점은
첫째, 마지막째 값들에 대해 현재 값을 잘 더해줬지만 나머지 값들에 대한 현재 값을 더해주지 못해 살짝 헤맸다.