[BOJ] 2096 내려가기

이강혁·2024년 7월 2일
0

백준

목록 보기
8/42

https://www.acmicpc.net/problem/2096

3열 짜리 배열이 있는데 아래 행으로 가면서 합치는데 +-1의 열에 있는 숫자와 합칠 수 있다. 이렇게 합쳐서 최대, 최소값을 구하라는 문제이다.
DP라는 것을 알고나서 원래 하던대로 DP 배열을 선언하고 기록하면서 처리했다.

n = int(input())

table = [list(map(int, input().split())) for _ in range(n)]

minDp = [[10, 10, 10] for _ in range(n)]
maxDp = [[-1, -1, -1] for _ in range(n)]

minDp[0] = table[0]
maxDp[0] = table[0]

# minDp[n][0] = min(minDp[n-1][0] + table[n][0], minDp[n-1][1] + table[n][0])

for i in range(1, n):
  minDp[i][0] = min(minDp[i-1][:2]) + table[i][0]
  minDp[i][1] = min(minDp[i-1]) + table[i][1]
  minDp[i][2] = min(minDp[i-1][1:]) + table[i][2]
  
  maxDp[i][0] = max(maxDp[i-1][:2]) + table[i][0]
  maxDp[i][1] = max(maxDp[i-1]) + table[i][1]
  maxDp[i][2] = max(maxDp[i-1][1:]) + table[i][2]
  
print(max(maxDp[-1]), min(minDp[-1]))

이번에는 메모리 초과가 났다.
아무래도 10만 X 3 크기의 배열을 3개나 만들어서 그런가 싶어서 minDp, maxDp는 2칸짜리 배열로 줄이기로 했다.

n = int(input())

table = [list(map(int, input().split())) for _ in range(n)]

minDp = [[10, 10, 10] for _ in range(2)]
maxDp = [[-1, -1, -1] for _ in range(2)]

minDp[0] = table[0].copy()
maxDp[0] = table[0].copy()

for i in range(1, n):
  minDp[i%2][0] = min(minDp[abs(i%2-1)][:2]) + table[i][0]
  minDp[i%2][1] = min(minDp[abs(i%2-1)]) + table[i][1]
  minDp[i%2][2] = min(minDp[abs(i%2-1)][1:]) + table[i][2]
  
  maxDp[i%2][0] = max(maxDp[abs(i%2-1)][:2]) + table[i][0]
  maxDp[i%2][1] = max(maxDp[abs(i%2-1)]) + table[i][1]
  maxDp[i%2][2] = max(maxDp[abs(i%2-1)][1:]) + table[i][2]
  
print(max(maxDp[(n-1)%2]), min(minDp[(n-1)%2]))

index가 홀, 짝에 따라서 새롭게 업데이트 되는 칸이 달라지게 했다. 마지막 index는 n의 길이가 홀수인지 짝수인지에 따라서 달라지게 했다.
n이 홀수라면 마지막 업데이트 되는 위치는 0번자리, 짝수라면 1번자리이기에 n-1해서 2로 나눈 나머지로 구했다.
그러나 이렇게 해도 메모리 초과가 발생했다.

그래서 입력되는 배열도 없애보기로 했다.


n = int(input())

minDp = [[10, 10, 10] for _ in range(2)]
maxDp = [[-1, -1, -1] for _ in range(2)]

for i in range(n):
  row = list(map(int, input().split()))
  
  minDp[i%2] = row.copy()
  maxDp[i%2] = row.copy()
  if i > 0:
    minDp[i%2][0] = min(minDp[abs(i%2-1)][:2]) + row[0]
    minDp[i%2][1] = min(minDp[abs(i%2-1)]) + row[1]
    minDp[i%2][2] = min(minDp[abs(i%2-1)][1:]) + row[2]
    
    maxDp[i%2][0] = max(maxDp[abs(i%2-1)][:2]) + row[0]
    maxDp[i%2][1] = max(maxDp[abs(i%2-1)]) + row[1]
    maxDp[i%2][2] = max(maxDp[abs(i%2-1)][1:]) + row[2]
  
print(max(maxDp[(n-1)%2]), min(minDp[(n-1)%2]))

최초에 입력받을 때 이후에는 같은 로직이 실행되도록 했다.

profile
사용자불량

0개의 댓글