반응형
📚 포도주 시식
문제
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다.
- 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
- 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.
효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오.
예를 들어 6개의 포도주 잔이 있고, 각각의 잔에 순서대로 6, 10, 13, 9, 8, 1 만큼의 포도주가 들어 있을 때, 첫 번째, 두 번째, 네 번째, 다섯 번째 포도주 잔을 선택하면 총 포도주 양이 33으로 최대로 마실 수 있다.
입력
첫째 줄에 포도주 잔의 개수 n이 주어진다. (1 ≤ n ≤ 10,000) 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다. 포도주의 양은 1,000 이하의 음이 아닌 정수이다.
출력
첫째 줄에 최대로 마실 수 있는 포도주의 양을 출력한다.
예제 입력 1 복사
6
6
10
13
9
8
1
예제 출력 1 복사
33
✍ 접근
- DP
- 경로에 접근할 수 있는 경우를 잘 구하면 된다
정답 코드
import sys
input = sys.stdin.readline
N = int(input())
arr=[0]
dy = [0]*(N+1)
for _ in range(N):
arr.append(int(input()))
dy[0] = arr[0]
dy[1] = arr[1]
if N >1:
dy[2] = max(arr[0]+arr[2], arr[1]+arr[2], dy[1]) 😣
if N >3:
for i in range(3,N+1):
dy[i] = max(dy[i-2]+arr[i], dy[i-3]+arr[i-1]+arr[i],dy[i-1])
print(max(dy))
미스가 많이 났다
문제는 대체로 list의 길이를 제대로 생각하지 않아서 발생하거나 / if문을 제대로 짜지 않아서 발생하는 경우가 많았다.
- arr에 미리 0을 넣어두고 포도주를 순서대로 append
- dy는 N+1(arr에 0을 넣어두었으니) 까지 돌린다
- dy[0] = arr[0] = 0
- dy[1] = arr[1] 로 초기화시킨다
😣 문제 발생 구간
- dy[2] 를 구하는 부분은 만약 N이 1이 들어오게 되면 list가 밖으로 벗어나는 문제를 발생시킨다.
- list를 포도주가 들어올 수 있는 최대공간으로 미리 만들어둔다
- if문을 이용해서 N이 1보다 클 때만 dy[2] 내용을 읽게 만든다
나는 2번을 사용했다.
- 비슷한 이유로 N이 3보다 클 때 for문을 돌면서 dy[i]를 구해준다.
- dy[i-2]+arr[i]
바로 전 포도주를 마시지 않았을 때의 경우 + 내 포도주를 마실 경우 - dy[i-3]+arr[i-1]+arr[i]
바로 전 포도주를 마셨을때의 경우 + 내 포도주를 마실 경우
이 부분에 설명을 보태자면
포도주가 1,2,3 세 잔이 있을 때 3번 포도주를 마실까 말까 고민하는 상황에서 바로 전 포도주를 마셨다면 2를 마셨다는 것이 된다 ==> 1은 마셨으면 안된다!
라는 논리로 구해진 식이다 - dy[i-1]
📌 간과할 수 있는 부분 : 현재 포도주를 마시는 것이 이득이 아닐 수도 있다.
따라서 현재 위치해있는 포도주를 마시지 않을 경우까지 가능성으로 둔다
- dy[i-2]+arr[i]
계단 오르기 문제랑 비슷한듯
⭐ 배움
- for문 밖에서도 dy[i] ... 를 이용하기도 하지만 list 범위를 잘 확인해야 한다
- 현재 내 것을 취하지 않을 때 더 큰 이득을 얻을 수도 있다
반응형
'🏄♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글
[ 백준 2583 ] ( python ) 영역 구하기 (0) | 2022.06.10 |
---|---|
[ 백준 1260 ] ( python ) DFS와 BFS (0) | 2022.06.10 |
[ 백준 1912 ] ( python ) 연속합 (0) | 2022.06.10 |
[ 백준 1932 ] ( python ) 정수 삼각형 (0) | 2022.06.09 |
[ 이코테 강의 ] 기타 그래프 이론 (0) | 2022.06.03 |