백준 2096번 내려가기 (Python, DP, Gold5)

전승재·2024년 1월 12일
0

알고리즘

목록 보기
71/88

백준 2096번 내려가기 문제 바로가기 링크

문제 접근

문제 설명
N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.

먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.

별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.

위의 사진과 같이 별표에서 다음으로 이동할 수 있는 위치는 동그라미와 같다.
이 문제에서는 열이 3개뿐이기에 단순하게 상수를 넣어 코딩하면 된다.

최대와 최소값을 저장하는 DP를 만들어 입력받으면서 최대, 최소값을 DP에 저장하며 갱신해 나간다.

문제 해결

최솟값 저장 DP 점화식

 minl = [min(minl[0], minl[1]) + line[0], min(minl)+ line[1], min(minl[1], minl[2])+ line[2]]

첫번째는 최솟값을 저장하기 위해서 한칸위의 첫번째와 두번째값 중 작은 값과 현재 위치한 값을 더해야 한다.
두번째는 최솟값을 저장하기 위해 한칸위의 줄 중 가장 작은 값과 현재 위치한 값을 더해야 한다.
이 방식으로 저장된 minl은 결국 현재 위치한 값을 더한 가장 작은 값 리스트를 담고 있을 것이다.
따라서 minl의 최솟값을 구하면 전체 루트중 가장 작은 값이 나오게 된다.

최댓값 저장 DP 점화식

maxl = [max(maxl[0], maxl[1]) + line[0], max(maxl)+ line[1], max(maxl[1], maxl[2])+ line[2]]

최댓값을 구하는 방식은 최솟값을 구하는 방식과 같다.

제출 코드

import sys
N = int(input())
minl = [0,0,0]
maxl = [0,0,0]
for i in range(N):
    line = list(map(int, sys.stdin.readline().split()))
    minl = [min(minl[0], minl[1]) + line[0], min(minl)+ line[1], min(minl[1], minl[2])+ line[2]]
    maxl = [max(maxl[0], maxl[1]) + line[0], max(maxl)+ line[1], max(maxl[1], maxl[2])+ line[2]]

print(max(maxl), min(minl))

0개의 댓글