백준 1932번 - 정수 삼각형
정수 삼각형 문제 바로 가기
풀이 날짜: 2026-01-10
baekjoon 알고리즘 문제 풀이
풀이 코드
import sys
input = sys.stdin.readline
n = int(input())
dp = []
for _ in range(n):
dp.append(list(map(int, input().split())))
for i in range(1,n):
for j in range(i+1):
if j == 0:
left_up = 0
else:
left_up = dp[i-1][j-1]
if j==i:
up = 0
else:
up = dp[i-1][j]
dp[i][j] = dp[i][j] + max(up, left_up)
print(max(dp[n-1]))
내가 선택한 풀이 방식
문제의 핵심은, “각 위치까지 도달했을 때의 최대 누적 합을 어떻게 저장할 것인가”이다.
DP 배열
이 문제에서는 입력 배열 자체를 DP 배열로 사용했다.
- dp[i][j]: “i번째 줄의 j번째 위치까지 내려왔을 때 만들 수 있는 최대 합” 즉, dp[0][0]은 맨 위 숫자 하나만 선택했을 때의 합이며, dp[3][1]은 4번째 줄의 두 번째 숫자까지 내려왔을 때의 최대 합을 의미한다.
헷갈렸던 점
이중 for문 구조가 순간적으로 헷갈렸었다.
i는 줄 번호를 의미하므로,
- 0번째 줄 → 숫자 1개
- 1번째 줄 → 숫자 2개
- 2번째 줄 → 숫자 3개
즉, i번째 줄에는 항상 i+1개의 숫자가 있다.
따라서 j는 range(i+1)까지 돌아야 한다.