위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
입출력 예
triangle | result |
---|---|
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
어렵지 않게 풀 수 있는 DP의 문제였다. Lv3은 아닌 것 같구 2정도의 난이도 였던 DP 문제이다. 문제의 예시 처럼 위에서 아래로 내려오면서 최대가 되는 경우가 언제가 될 수 있을지 고민하는 그리디의 유형인 것 같기도 하다.
일단 위를 기준으로 dp 이차원 배열을 생성하고 triangle과 똑같은 형태로 만들어 준다. 0으로 초기화 해준 뒤 이를 차례대로 내려오면서 위에 값들 중 큰 값들이 담길 수 있도록 계속해서 초기화 해주는 방식이다.
다만, 한 가지 유의할 점은 총 3가지의 경우의 수가 있는 점인데,
이 3가지 경우를 고려해서 2번 째의 경우에는 둘 중 큰 값이 내려올 수 있도록 처리해주면 된다.
# 오른쪽 위
if j == 0:
dp[i][j] = dp[i - 1][j] + length[j]
# 왼쪽 위
elif j == len(length) - 1:
dp[i][j] = dp[i - 1][j - 1] + length[j]
# 오른쪽, 왼쪽 위 비교
else:
dp[i][j] = max(dp[i - 1][j - 1] + length[j], dp[i - 1][j] + length[j])
def solution(triangle):
dp = [[0 for _ in range(i + 1)] for i in range(len(triangle))]
dp[0][0] = triangle[0][0]
for i in range(1, len(triangle)):
length = triangle[i]
for j in range(len(length)):
if j == 0:
dp[i][j] = dp[i - 1][j] + length[j]
elif j == len(length) - 1:
dp[i][j] = dp[i - 1][j - 1] + length[j]
else:
dp[i][j] = max(dp[i - 1][j - 1] + length[j], dp[i - 1][j] + length[j])
return max(dp[len(triangle) - 1])
어렵지 않은 dp 유형인데,,,, 사람들이 풀어 놓은 것 중 한줄로 풀어낸게 있더라,, 굉장한 사람들이 많은게 보였다 ㅠㅠ
하반기 공고가 계속해서 나오고 있는데 이에 대비해서 코딩테스트 준비를 지속적으로 해야할 것 같다. 문제 중에서 특히 그래프와 관련된 문제는 더 익숙해지도록 준비하고, 구현, DP와 같은 문제는 자주 나오기도 하니깐 아이디어를 떠올리는 것에 집중해보자!!
이제 정처기 공부해야지...
화이팅~!