https://school.programmers.co.kr/learn/courses/30/lessons/43105
문제는 다이나믹 프로그래밍 문제이다.
다이나믹 프로그래밍 문제는 개인적으로 가장 어려워 하는 유형인데 그래도 어렵지 않게 점화식을 구할 수 있었던 비교적 가벼운 문제였다.
이 문제를 포스팅하는 이유는 2차원 배열에서의 최대값을 찾는 로직을 작성하기 위함이다.
def solution(triangle):
# dp 테이블 초기화 -> dp 테이블 초기화에 너무 쓸데없는 코드들을 낭비했다.
dp = []
length = []
for i in range(len(triangle)):
length.append(len(triangle[i]))
for i in length:
line = []
for j in range(i):
line.append(0)
dp.append(line)
dp[0][0] = triangle[0][0]
for i in range(1, len(triangle)):
for j in range(len(triangle[i])):
# 맨 왼쪽
if j == 0:
dp[i][j] = dp[i-1][0] + triangle[i][j]
# 맨 오른쪽
elif j == len(triangle[i]) - 1:
dp[i][j] = dp[i-1][j-1] + triangle[i][j]
else:
# 점화식
dp[i][j] = max(dp[i-1][j-1] + triangle[i][j], dp[i-1][j] + triangle[i][j])
# 2차원 배열 최대값 찾기 -> map 함수 유용!
max_value = max(map(max, dp))
return max_value
dp 테이블 초기화에 있어 깔끔한 풀이는 아니지만, 핵심은 마지막 줄에서 2차원 배열의 최대값을 찾는 것이다.
이 때 map 함수를 사용했다.
map(function, iterable)
iterable한 자료형의 값들에 하나하나 function을 먹여주는 것이다.
map 객체를 반환하기 때문에 후에 list나 tuple로 바꿔주는 작업을 진행해주는 것이 좋다.
max(map(max, dp))
dp 라는 2차원 배열에, 각 원소는 1차원 배열이다.
즉 각 1차원 배열에 max 함수를 맥여 각 배열의 최대값으로 이루어진 map 객체를 만든다.
그 후 다시 max 함수를 맥이면 최종 최대값을 구할 수 있는 것이다.