알고리즘/백준

[백준]2096 내려가기(Python)

cha_eyoon 2024. 2. 3. 21:16

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

 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

 

코드
import sys

input = sys.stdin.readline

# 3열이 N개의 계단이 존재
N = int(input())

# 첫 번째 계단(0) 
row = list(map(int, input().split()))

max_dp = row
min_dp = row

# 두 번째 계단부터 마지막 계단까지
for i in range(1, N):
    l, m, r = map(int, input().split()) # 현재 계단의 값(1 ~ N-1)

    for j in range(3):  # 왼, 중, 오
        if j == 0:  # 왼쪽인 경우
            # 이전 계단의 왼쪽과 중앙 중 최대(or 최소)에 현재 계단의 값을 더함(+a)
            max_left = max(max_dp[j], max_dp[j+1]) + l
            min_left = min(min_dp[j], min_dp[j+1]) + l

        if j == 1:  # 중앙인 경우
            max_mid = max(max_dp[j-1], max_dp[j], max_dp[j+1]) + m
            min_mid = min(min_dp[j-1], min_dp[j], min_dp[j+1]) + m

        if j == 2:  # 오른쪽인 경우
            max_right = max(max_dp[j-1], max_dp[j]) + r
            min_right = min(min_dp[j-1], min_dp[j]) + r

    # 현재 계단의 최대, 최소 갱신 후 저장 => N-1번 계단까지
    max_dp = [max_left, max_mid, max_right]
    min_dp = [min_left, min_mid, min_right]

print(max(max_dp), min(min_dp))