꾸준하게 거북이처럼

백준 2156번 - 파이썬 본문

Algorithm 문제 & 공부/DP

백준 2156번 - 파이썬

somm12 2022. 8. 21. 10:54

 

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

아직 백준에서만 dp문제를 접했지만, dp 문제는 항상 

이전의 값을 참고하여 문제에서 주어진 조건을 차례대로 충족해나가는 문제인 것 같다.

예를 들어, 1 ~ n 까지의 어떤 배열이 있고 + 문제에서 구하고자 하는 것과 주어진 조건 + 최댓값 구하기 문제라면,

1, 2, 3, 4,,, 까지 일 때의 최댓값을 축적해나가는 것이다. 그래서 마지막 n번째 배열에는 최종 최댓값을 구할 수 있는 것. 축적해 나가는 i 까지의 최댓값 후보는 여러개인 경우가 많고 max를 구한다. 그 경우의 수(후보들) 를 찾는 것이 곧 점화식을 찾는 길! 

이번 2156번도 그런 문제이다.

풀이

문제에서 중요한 것은 3개 연속으로 와인을 못마시는 것과, 여기서

와인을 마실 수도 있고 지나칠 수(선택 O or X)도 있다. 구체적으로 3가지 경우의 수가 있다.

# 1 : 이번 포도주를 먹고 이전 포도주를 먹지 않은 경우
# 2 : 이번 포도주를 먹고 이전 포도주도 먹은 경우
# 3 : 이번 포도주를 먹지 않아야 하는 경우
# 위 세가지 경우를 고려하여 max를 구한다.

코드

n = int(input())
w = [0]
for i in range(n):
    w.append(int(input()))
dp = [0]
dp.append(w[1])
if n > 1:# n == 2 일때
    dp.append(w[1] + w[2])
for i in range(3, n + 1):
    case1 = dp[i - 2] + w[i]
    case2 = dp[i - 3] + w[i - 1] + w[i]
    case3 = dp[i - 1]
    dp.append(max(case1, case2, case3))
print(dp[n])

 

참고자료

 

백준 2156번(python)

n = int(input()) wine_list = [int(input()) for x in range(n)] dp = [0] dp.append(wine_list[0]) if(n > 1): dp.append(wine_list[0] + wine_list[1]) # 연속 3잔을 마시지 않아야 하므로 # 1 : 이번 포도주..

hwiyong.tistory.com

 

'Algorithm 문제 & 공부 > DP' 카테고리의 다른 글

백준 11054번 파이썬 - 가장 긴 바이토닉 부분 수열  (0) 2022.08.25
백준 11055번 파이썬  (0) 2022.08.23
백준 1309 파이썬  (0) 2022.08.18
백준 1149번 파이썬  (0) 2022.08.17
백준 2225번 - 파이썬  (0) 2022.08.15
Comments