반응형
💻 Problem
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
✏️ Solution 1
import sys
input = sys.stdin.readline
n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]
dp = [[0] * i for i in range(1, n + 1)]
dp[0][0] = triangle[0][0]
for i in range(n - 1):
for j in range(i + 1):
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + triangle[i + 1][j])
dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + triangle[i + 1][j + 1])
print(max(dp[-1]))
dp 배열을 따로 선언해서 위에서부터 아래로 퍼뜨리는 방법이다.
맨 꼭대기부터 시작해서 두 자식(왼쪽 아래, 오른쪽 아래)으로 값을 전파하며 최댓값을 유지한다.
마지막행에서 최댓값이 정답이 된다.
✏️ Solution 2
import sys
input = sys.stdin.readline
n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]
for i in range(1, n):
for j in range(i + 1):
if j == 0: # 맨 왼쪽
triangle[i][j] += triangle[i - 1][j]
elif j == i: # 맨 오른쪽
triangle[i][j] += triangle[i - 1][j - 1]
else: # 가운데
triangle[i][j] += max(triangle[i - 1][j - 1], triangle[i - 1][j])
print(max(triangle[-1]))
dp 배열을 따로 선언하지 않고 삼각형을 그대로 최댓값 누적으로 덮어씌운다.
맨 왼쪽, 맨 오른쪽, 가운데를 분기해서 계산한다.
양 쪽 맨 끝은 부모가 하나이고 가운데는 부모가 둘이므로 가운데일 경우에만 두 부모의 값을 비교해서 더한다.
✏️ Solution 3 ☆
import sys
input = sys.stdin.readline
n = int(input())
triangle = [list(map(int, input().split())) for _ in range(n)]
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])
아래에서 위로 최댓값을 누적하는 바텀업 방식이다.
위에서부터 생각하면서 부모에서 자식으로 퍼뜨릴지 자식에서 부모로 퍼뜨릴지만 생각했는데..
바텀업으로 하면 이렇게나 간단하다니 천재적인 방법..
가끔씩 이렇게 뒤집어야 더 편해지는 문제들이 있긴 한데.. 평소엔 떠올렸는데 이 문제에선 순간 떠올리지 못했음 ㅠㅠ
dp에 약한데 이 문제는 dp 치고는 쉽게 떠올릴 수 있는 문제 같다.
반응형
'Algorithm > 백준 (BOJ)' 카테고리의 다른 글
[Python] 백준/BOJ 17291번: 새끼치기 (Silver 2) (0) | 2025.08.22 |
---|---|
[Python] 백준/BOJ 21760번: 야구 시즌 (Silver 5) (0) | 2025.08.20 |
[Python] 백준/BOJ 14500번: 테트로미노 (Gold 4) (0) | 2025.08.18 |
[Python] 백준/BOJ 14626번: ISBN (Bronze 1) (5) | 2025.08.17 |