백준 1932번 정수 삼각형
https://www.acmicpc.net/problem/1932
문제
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입력
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
문제 유형
다이나믹 프로그래밍
풀이 방법 도출
이 문제는 각 경로를 탐색하면서 합이 최대가 되는 경로를 찾는 것이 핵심입니다.
- 아래층에서 선택할 수 있는 두 값 중 더 큰 값을 선택하여 더합니다. 이를 삼각형의 아래층부터 위층으로 갱신하면서 진행하면 최적의 해를 구할 수 있습니다.
- 점화식은 triangle[i][j] += max(triangle[i+1][j], triangle[i+1][j+1]) 가 됩니다.
- 삼각형의 맨 아랫줄은 그대로 유지한 채 위층부터 값을 갱신합니다.
시간 복잡도
- DP 방식으로 각 요소를 한 번씩 갱신하므로 O(n²)
핵심 코드 삽입 및 설명
import sys
input = sys.stdin.readline # 빠른 입력 사용용
n = int(input()) # 삼각형의 크기
triangle = [] # 삼각형 데이터 리스트
# 리스트 입력 받기
for _ in range(n):
triangle.append(list(map(int, input().split())))
# 아래층부터 위층으로 갱신하며 최댓값을 계산 (Bottom-up)
for i in range(n-2, -1, -1): # 아래에서 두 번째 줄부터 역순으로 탐색
for j in range(i+1): # 해당 줄의 모든 요소에 대해 계산
# 현재 위치의 값을 아래 두 개 중 큰 값과 더하여 갱신
triangle[i][j] += max(triangle[i+1][j], triangle[i+1][j+1])
# 최상단에 있는 값이 최대 합이 되는 경로의 합
print(triangle[0][0])
'Study > 코딩 테스트' 카테고리의 다른 글
[백준] 11651번 좌표 정렬하기 2 해설 및 풀이 (Python) (0) | 2025.03.15 |
---|---|
[백준] 2775번 부녀회장이 될테야 해설 및 풀이 (Python) (0) | 2025.03.14 |
[백준] 2798번 블랙잭 해설 및 풀이 (Python) (0) | 2025.03.13 |
[백준] 2869번 달팽이는 올라가고 싶다 해설 및 풀이 (Python) (0) | 2025.03.12 |
[백준] 1753번 최단경로 해설 및 풀이 (Python) (0) | 2025.03.11 |