본문 바로가기

프로그래밍/문제풀이

[Python] 백준 1932 정수 삼각형

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

 

# 1932 정수 삼각형

N = int(input())
numbers = [list(map(int, input().split())) for _ in range(N)]

dp = [0] * N
dp[0] = numbers[0][0]

for level in range(1, N):
    for i in range(level, -1, -1):
        if i == 0:
            dp[i] = dp[0] + numbers[level][i]
        else:
            dp[i] = max(dp[i], dp[i - 1]) + numbers[level][i]

print(max(dp))

 

 

dp를 사용하여 문제를 풀었다.

이중 리스트를 리스트 한 개로 줄였다고 생각하면 편하다.

 

for i in range(level, -1, -1)에서 역순으로 탐색하였다.

역순으로 탐색하지 않으면, 같은 행에서 이전의 연산이 다음 연산에 영향을 주기 때문에 역순으로 탐색하였다.

 

맨 처음엔 요렇게 풀었다가, 위처럼 최적화하였다.

 

# 1932 정수 삼각형

N = int(input())
numbers = list()
for _ in range(N):
    num = list(map(int, input().split()))
    numbers.append(num)

dp = [0] * N
dp[0] = numbers[0][0]
if N >= 2:
    dp[1] = dp[0] + numbers[1][1]
    dp[0] = dp[0] + numbers[1][0]

for level in range(2, N):
    for i in range(level, -1, -1):
        if i == level + 1:
            dp[i] = dp[i - 1] + numbers[level][i]
        elif i == 0:
            dp[i] = dp[0] + numbers[level][i]
        else:
            dp[i] = max(dp[i], dp[i - 1]) + numbers[level][i]

print(max(dp))

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[Python] 백준 1967 트리의 지름  (0) 2022.08.01
[Python] 백준 2011 암호코드  (0) 2022.08.01
[Python] 백준 2512 예산  (0) 2022.08.01
[Python] 백준 16508 전공책  (0) 2022.08.01
[Python] 백준 19949 영재의 시험  (0) 2022.07.11