알고리즘/백준
[백준]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))