반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 은행IT
- 채널계
- SQL
- union
- jdk
- 디렉토리계층구조
- 코딩테스트
- 의사결정나무모형
- 맥북셋팅
- 맥북
- python
- 모놀리식
- 코어뱅킹
- 계정계
- MSA
- 프로그래머스
- 학점은행제무료강의
- DB
- it자격증
- Pass By Value
- Homebrew
- 맥북환경설정
- 컴퓨터공학학사취득
- 렌탈스튜디오창업
- 개인프로필스튜디오창업
- 학점은행제
- oracleapex
- fastapi
- 오라클
- jdk17
Archives
- Today
- Total
개발머해니
[파이썬] 새꼼달꼼 장사 (1) Memoization - 다이나믹 프로그래밍 ★ 본문
728x90
반응형
실습 설명
솔희는 학원 쉬는 시간에 친구들을 상대로 새꼼달꼼 장사를 합니다. 그러다 문뜩, 갖고 있는 새꼼달꼼으로 벌어들일 수 있는 최대 수익이 궁금해졌는데요...
가능한 최대 수익을 리턴시켜 주는 함수 max_profit_memo를 Memoization 방식으로 작성해 보세요. max_profit_memo는 파라미터 세 개를 받습니다.
- price_list: 개수별 가격이 정리되어 있는 리스트
- count: 판매할 새꼼달꼼 개수
- cache: 개수별 최대 수익이 저장되어 있는 사전
예를 들어 price_list가 [100, 400, 800, 900, 1000]이라면,
- 새꼼달꼼 1개에 100원
- 새꼼달꼼 2개에 400원
- 새꼼달꼼 3개에 800원
- 새꼼달꼼 4개에 900원
- 새꼼달꼼 5개에 1000원
이렇게 가격이 책정된 건데요. 만약 오늘 솔희가 새꼼달꼼 5개를 판매한다면 최대로 얼마를 벌 수 있을까요?
한 친구에게 3개 팔고 다른 친구에게 2개를 팔면, 800+400을 해서 총 1200원의 수익을 낼 수 있겠죠.
실습 결과
def max_profit_memo(price_list, count, cache):
# Base Case: 0개 혹은 1개면 부분 문제로 나눌 필요가 없기 때문에 가격을 바로 리턴한다
if count < 2:
cache[count] = price_list[count]
return cache[count]
# 이미 계산한 값이면 cache에 저장된 값을 리턴한다
if count in cache:
return cache[count]
# profit은 count개를 팔아서 가능한 최대 수익을 저장하는 변수
# 팔려고 하는 총개수에 대한 가격이 price_list에 없으면 일단 0으로 설정
# 팔려고 하는 총개수에 대한 가격이 price_list에 있으면 일단 그 가격으로 설정
if count < len(price_list):
profit = price_list[count]
else:
profit = 0
# count개를 팔 수 있는 조합들을 비교해서, 가능한 최대 수익을 profit에 저장
for i in range(1, count // 2 + 1):
profit = max(profit, max_profit_memo(price_list, i, cache)
+ max_profit_memo(price_list, count - i, cache))
# 계산된 최대 수익을 cache에 저장
cache[count] = profit
return profit
def max_profit(price_list, count):
max_profit_cache = {}
return max_profit_memo(price_list, count, max_profit_cache)
# 테스트 코드
print(max_profit([0, 100, 400, 800, 900, 1000], 5))
print(max_profit([0, 100, 400, 800, 900, 1000], 10))
print(max_profit([0, 100, 400, 800, 900, 1000, 1400, 1600, 2100, 2200], 9))
1200
2500
2400
728x90
반응형
'알고리즘' 카테고리의 다른 글
[파이썬] 최소 동전으로 거슬러 주기 - 그리디 (0) | 2023.09.24 |
---|---|
[파이썬] 새꼼달꼼 장사 (2) Tabulation - 다이나믹 프로그래밍 ★ (0) | 2023.09.19 |
[파이썬] 피보나치 수열 (3) 공간 최적화 - 다이나믹 프로그래밍 ★ (0) | 2023.09.18 |
[파이썬] 피보나치 수열 (2) tabulation로 구현 - 다이나믹 프로그래밍 ★ (0) | 2023.09.18 |
[파이썬] 피보나치 수열 (1) memoization로 구현 - 다이나믹 프로그래밍 ★ (0) | 2023.09.18 |