본문 바로가기
코딩테스트 파이썬/백준

내려가기 ( 2096번 )

by 세용용용용 2025. 1. 24.

2096번: 내려가기

 

나의 풀이

import sys

def _main(n, n_list):
    # 현재 행의 최소값 및 최대값을 저장하는 리스트
    prev_min = n_list[0]
    prev_max = n_list[0]

    for i in range(1, n):
        curr_min = [0] * len(n_list[0])
        curr_max = [0] * len(n_list[0])

        for j in range(len(n_list[0])):
            # 최소값 계산
            if j == 0:
                curr_min[j] = min(prev_min[j], prev_min[j + 1]) + n_list[i][j]
            elif j == len(n_list[0]) - 1:
                curr_min[j] = min(prev_min[j], prev_min[j - 1]) + n_list[i][j]
            else:
                curr_min[j] = min(prev_min[j], prev_min[j - 1], prev_min[j + 1]) + n_list[i][j]

            # 최대값 계산
            if j == 0:
                curr_max[j] = max(prev_max[j], prev_max[j + 1]) + n_list[i][j]
            elif j == len(n_list[0]) - 1:
                curr_max[j] = max(prev_max[j], prev_max[j - 1]) + n_list[i][j]
            else:
                curr_max[j] = max(prev_max[j], prev_max[j - 1], prev_max[j + 1]) + n_list[i][j]

        # 현재 행을 이전 행으로 업데이트
        prev_min, prev_max = curr_min, curr_max

    # 마지막 행에서 최소값과 최대값을 반환
    return f"{max(prev_max)} {min(prev_min)}"

# 입력 처리
n = int(sys.stdin.readline())
n_list = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]

# 결과 출력
print(_main(n, n_list))

 

시간 복잡도

for i in range(1, n) : n 만큼의 연산을 수행 ( 선형 시간 복잡도 )
    # 내부 로직은 상수 시간
해당 알고리즘 시간 복잡도 : 선형 시간 복잡도 ( O(n) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

가장 긴 바이토닉 부분 수열 ( 11054번 )  (0) 2025.02.03
평범한 배낭 (12865 번)  (0) 2025.02.01
최소비용 구하기 ( 1916 )  (0) 2025.01.20
학번( 3711번 )  (0) 2025.01.15
스티커 ( 9465번 )  (0) 2025.01.14