티스토리 뷰

알고리즘

[백준 2096 / Python] 내려가기

lemonade99 2023. 8. 31. 17:25

 

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

접근방식

dp 배열을 만들어서 dp[현재위치값] = 현재 위치값+ max(이동할 수 있는 위치 값) 으로 값을 갱신하며 최대,최솟값을 구한다.

 

처음 풀이

import sys
input = sys.stdin.readline

n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
dp_max = [[0] * 3 for _ in range(n)]
dp_min = [[0] * 3 for _ in range(n)]

dp_max[0] = arr[0]
dp_min[0] = arr[0]

for i in range(1, n):
    dp_max[i][0] = max(arr[i][0] + dp_max[i - 1][0], arr[i][0] + dp_max[i - 1][1])
    dp_max[i][1] = max(arr[i][1] + dp_max[i - 1][0], arr[i][1] + dp_max[i - 1][1], arr[i][1] + dp_max[i - 1][2])
    dp_max[i][2] = max(arr[i][2] + dp_max[i - 1][1], arr[i][2] + dp_max[i - 1][2])

    dp_min[i][0] = min(arr[i][0] + dp_min[i - 1][0], arr[i][0] + dp_min[i - 1][1])
    dp_min[i][1] = min(arr[i][1] + dp_min[i - 1][0], arr[i][1] + dp_min[i - 1][1], arr[i][1] + dp_min[i - 1][2])
    dp_min[i][2] = min(arr[i][2] + dp_min[i - 1][1], arr[i][2] + dp_min[i - 1][2])

max_result = max(dp_max[n - 1])
min_result = min(dp_min[n - 1])
print(str(max_result) + " " + str(min_result))

테스트케이스는 통과되었지만, 메모리제한으로 인해 메모리초과가 되었다.

그래서 위의 코드에서 배열을 선언하지 않고, 입력값을 두 번 받아 메모리 초과를 해결했다.

 

풀이 코드

import sys
input = sys.stdin.readline

n = int(input())
# 메모리 제한으로 첫 줄 입력 값을 dp에 갱신
a, b, c = map(int, input().split())
dp_max = [[0] * 3 for _ in range(n)]
dp_min = [[0] * 3 for _ in range(n)]

dp_max[0] = [a,b,c]
dp_min[0] = [a,b,c]

for i in range(1, n):
    a, b, c = map(int, input().split())
    dp_max[i][0] = max(a + dp_max[i - 1][0], a + dp_max[i - 1][1])
    dp_max[i][1] = max(b + dp_max[i - 1][0], b + dp_max[i - 1][1], b + dp_max[i - 1][2])
    dp_max[i][2] = max(c + dp_max[i - 1][1], c + dp_max[i - 1][2])

    dp_min[i][0] = min(a + dp_min[i - 1][0], a + dp_min[i - 1][1])
    dp_min[i][1] = min(b + dp_min[i - 1][0], b + dp_min[i - 1][1],b + dp_min[i - 1][2])
    dp_min[i][2] = min(c + dp_min[i - 1][1], c + dp_min[i - 1][2])

max_result = max(dp_max[n - 1])
min_result = min(dp_min[n - 1])
print(max_result,min_result)

 

'알고리즘' 카테고리의 다른 글

[백준 1520 / Python] 내리막 길  (0) 2023.08.27
[백준 10026 / Python] 적록색약  (0) 2023.08.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함