728x90
문제출처: https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
1. 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
n = int(input())
wine = []
for i in range(n):
wine.append(int(input()))
#wine 0부터 시작이니까 wine[0]=1잔
dp = [0]*n
dp[0] = wine[0]
dp[1]=wine[0]+wine[1]
dp[2]=max(wine[2]+wine[0],wine[2]+wine[1],dp[1])
for i in range(3, n):
#1. 이전 와인, 현재와인 마시고, 전전 와인 안마심 : wine[i-1]+wine[i]+dp[i-3]
#2. 현재와인 마시고,이전 와인 안마심 : wine[i]+dp[i-2]
#3. 현재와인 안마심
dp[i] = max(wine[i-1]+wine[i]+dp[i-3], wine[i]+dp[i-2], dp[i-1])
print(dp[n-1])
|
cs |
2. 해결과정
wine이라는 빈 리스트에 와인 양을 넣어준다.
dp 리스트를 설정해주고,
dp[0] = wine[0]
dp[1]=wine[0]+wine[1] 을 미리 작성해준다.
dp[2]의 경우 연속해서 3잔을 마시면 안되기 때문에 마실 것 중에 양이 많은 것 2개를 골라줘야 하므로 max(wine[2]+wine[0],wine[2]+wine[1],dp[1]) 를 도출해 낼 수 있다.
이제 4잔부터 n까지를 생각해주면
#1. 이전 와인, 현재와인 마시고, 전전 와인 안마심 : wine[i-1]+wine[i]+dp[i-3]
#2. 현재와인 마시고,이전 와인 안마심 : wine[i]+dp[i-2]
#3. 현재와인 안마심
의 규칙을 찾을 수 있고, 3가지 케이스 중에서 가장 큰 값을 출력해주면 된다.
3. 느낀점
규칙 찾기 어려웠다...dp는 진짜로 연습 많이 해야할 것 같다. ㅜ
728x90
'공부 자료 > 알고리즘' 카테고리의 다른 글
(Python/파이썬) 백준 2523번 - 별 찍기 -13 (0) | 2021.08.04 |
---|---|
(Python/파이썬) 백준 4153번 - 직각삼각형 (0) | 2021.08.04 |
(Python/파이썬) 백준 1912번 - 연속합 (0) | 2021.08.04 |
(Python/파이썬) 백준 2193번 - 이친수 (0) | 2021.08.04 |
(Python/파이썬) 백준 1475번 - 방 번호 (0) | 2021.08.03 |