[BOJ] 내려가기

Minsu Han·2023년 2월 27일
0

알고리즘연습

목록 보기
89/105

코드

import sys
import copy
input = sys.stdin.readline

n = int(input())

# 한 줄씩 읽고 계산하고 버려야 메모리 초과를 피할 수 있다
maxPrev = [0,0,0]
minPrev = [0,0,0]

for _ in range(n):
    inp = list(map(int, input().split()))
    tmp = [0,0,0]
    tmp[0] = inp[0] + max(maxPrev[:2])
    tmp[1] = inp[1] + max(maxPrev)
    tmp[2] = inp[2] + max(maxPrev[1:])
    maxPrev = copy.deepcopy(tmp)

    tmp[0] = inp[0] + min(minPrev[:2])
    tmp[1] = inp[1] + min(minPrev)
    tmp[2] = inp[2] + min(minPrev[1:])
    minPrev = copy.deepcopy(tmp)

print(max(maxPrev), min(minPrev))

결과

image


풀이 방법

  • DP를 활용하여 해결하였다.
  • 왼쪽, 중간, 오른쪽 위치마다 이전 줄에서 택할 수 있는 값들 중 최대/최소값을 더해가며 마지막 줄까지 계산한다.
  • 다만 이 문제는 메모리 제한이 4MB이기 때문에 처음부터 전체 리스트를 저장하여 사용하면 메모리 초과가 발생하므로 한 줄씩 읽고 계산해야 했다.

profile
기록하기

1개의 댓글

comment-user-thumbnail
2023년 2월 28일

21년에 만드신 'flutter로 만든 간단한 대학생 커뮤니티 서비스' 앱을 보고 댓글을 달아봅니다.
프로세스형태가 유사한 점이 많아서 혹시 개발 의뢰가능하실까 싶어 연락드려봅니다.
junee77@gmail.com으로 연락을 주실수 있을까요?

답글 달기