Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 백준 숨바꼭질
  • 백준
  • 시뮬레이션
  • Next.js
  • React
  • dfs
  • 백준 파이썬
  • bfs
  • 문자열
  • 파이썬 다익스트라
  • 파이썬 감시 피하기
  • 파이썬
  • BFS + DP
  • 구현
  • 이분탐색
  • js
  • 자바스크립트
  • react-router-dom
  • 플로이드 워셜
  • DP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 2156 ] ( python ) 포도주 시식

2022. 6. 10. 12:56
반응형

 

📚 포도주 시식

 

문제

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

  1. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
  2. 연속으로 놓여 있는 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]
      📌 간과할 수 있는 부분 : 현재 포도주를 마시는 것이 이득이 아닐 수도 있다.
      따라서 현재 위치해있는 포도주를 마시지 않을 경우까지 가능성으로 둔다

계단 오르기 문제랑 비슷한듯

⭐ 배움

  • 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
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 백준 2583 ] ( python ) 영역 구하기
    • [ 백준 1260 ] ( python ) DFS와 BFS
    • [ 백준 1912 ] ( python ) 연속합
    • [ 백준 1932 ] ( python ) 정수 삼각형
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바