/ ALGORITHM

(백준 with python) 2156 포도주 시식


2156 포도주 시식

포도주

n = int(input())
wine = [0]
for i in range(n):
    wine.append(int(input()))
    
dp = [0] * (n + 1)

for i in range(1, n + 1):
    if i == 1:
        dp[i] = wine[1]
    elif i == 2:
        dp[i] = wine[1] + wine[2]
        
    else:
        dp[i] = max(wine[i] + dp[i - 2], wine[i] + wine[i - 1] + dp[i - 3], dp[i - 1])
        

print(dp[n])


로직 구현 순서

  1. 입력값 받는 로직부분도 생각을 해야한다.

여기서는 wine의 양이 들어가는 list(wine)와 해당 인덱스에 누적된 와인의 최댓값이 들어가는 list(dp) 2가지가 필요하다. 이 말은 즉슨 와인이 1개일때 dp[1]에는 wine 1개 양의 최댓값이 들어가야 한다.
여기서 wine리스트에 0을 미리 넣고 dp의 리스트를 0으로 초기화할때 n+1을 한 이유는 인덱스는 0부터 시작이기 때문에 리스트 1부터 실제 와인의 양이 들어가게 하기위해 0인덱스 부분을 미리 처리한 것이다.

n = int(input())
wine = [0]
for i in range(n):
  wine.append(int(input())

dp = [0] * (n + 1)


  1. 와인의 개수가 1개일때부터 n개일때까지 하나씩 생각해본다.

와인이 한개일때는 최댓값도 와인 한개의 양 값일테니 dp[1]= wine[1]이 들어가면 된다. 2일때도 와인 2개를 모두 더한 값이 최댓값일 테니 wine[1] + wine[2]로 따로 처리해주면 된다. 3개부터는 경우의 수를 생각해야한다

  • 와인이 3개일 경우 가장 마지막 와인인 wine[3]와인을 선택했을 경우, 선택하지 않았을 경우로 나누어진다
  • 와인 wine[3]을 선택했을 경우 두번째 와인을 선택한 경우와 두번째 와인을 선택하지 않았을 경우로 나누어진다

위의 경우의 수를 코드로 옮겨적는다고 생각하면 된다.

3번째 와인 선택하지 않았을 경우

이럴 경우에는 2번째 와인까지 구했던 누적된 최댓값을 구하면 된다.

dp[i - 1]

3번째 와인 선택하고 2번째 와인도 선택한 경우

연속으로 3개 이상 마시지 못하기 때문에 wine[3] + wine[2] 를 더하고 와인 전전값에 나왔던 최댓값을 더해준다 . wine[1]은 먹을 수 없기때문이다

wine[3] + wine[2] + dp[i - 3]

3번째 와인 선택하고 2번째 와인은 선택하지 않은 경우
3번째 와인을 마시고 2번째 와인을 마시지 않았기 때문에 1번째 와인까지의 최댓값을 더해주면 된다

wine[3] + dp[i - 2]