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 |
Tags
- dfs
- list
- 프로그래머스
- 파이썬
- 12865
- 알고리즘
- 데카르트 곱
- 소수찾기
- 대소비교
- 백준 12015
- 백준
- 백준 2606
- 백준 1535
- boj 11053
- LCS2
- 평범한 배낭
- python
- BFS
- BOJ 2606
- 냅색
- 백준_2178
- 백준 9252
- 9663
- 리스트
- 증가하는 부분수열 2
- 타겟 넘버
- 미로탐색
- 2606
- 8-queen
- 가장 긴 증가하는 부분수열
Archives
- Today
- Total
Devlog_by_0giru
[boj] 퇴사_14501 본문
# 퇴사 https://www.acmicpc.net/problem/14501
time_cost = list()
price_earn = list()
max_val = 0
N = int(input())
dp = [0 for i in range(N+1)]
for _ in range(N):
T, P = map(int, input().split())
time_cost.append(T)
price_earn.append(P)
# dp[i] = i일부터 마지막까지 상담 시 얻을 수 있는 최대 이득
# dp[i] = p[i] + dp[i+t[i]]
# N일부터 1일까지 거꾸로 계산
for i in range(N-1, -1, -1):
temp = i + time_cost[i]
if temp <= N:
dp[i] = max(price_earn[i] + dp[temp], max_val)
max_val = dp[i]
else:
dp[i] = max_val
print(max_val)
이전 삼성 SW 코딩테스트 기출문제라고 한다.
DP를 이용해 푸는 문제인데 반나절 이상을 고민했는데도 도저히 문제를 맞출수가 없어서 해답이란 해답을 모조리 찾아봤다. 심지어 해답도 이해가 잘 안감...(패배감 오지고지리고...)
각 날의 상담마다 소요되는 시간 time_cost 리스트와 해당하는 이득인 price_earn 리스트에 값을 저장해 사용한다.
dp는 점화식을 세우는 것과 이전에 계산한 결과를 이용하는 것이 관건인데, 이 문제에서는 " i번째 날부터 상담을 하여 얻을 수 있는 최대의 이득 " 을 dp[i]라 하여 dp리스트에 저장해 사용한다.
만약 첫째 날부터 상담을 시작하고 첫째 날 상담의 소요시간이 3일이라면, 4일부터 상담이 가능하므로 'dp[1] = 1일차의 상담 이득 + 4일차부터 얻을수 있는 최대 이득' 이된다. 이를 수식으로 쓰면 dp[1] = dp[time_cost[1]] + price_earn[1]이 된다.
또 하나 염두해야 할 점은, 상담이 끝난 이후에 바로 상담을 시작한다고 해서 반드시 최대 이익을 보장하지는 않는다는 점이다.
사실 글을 쓰면서도 잘 설명하기가 너무 어렵다고 느껴진다. 이후에 반추하며 좀 더 깔끔하게 설명할 수 있도록 공부할 예정이다.
'[PS]' 카테고리의 다른 글
[boj] 미로 탐색_2178 (0) | 2021.03.07 |
---|---|
[boj] LCS2_9252 (0) | 2021.03.04 |
[boj] 가장 긴 증가하는 부분수열_11053 (완전탐색, DP) (1) | 2021.02.24 |
[boj] 치킨 배달_15686 (0) | 2021.02.23 |
[boj] 알파벳_1987 (0) | 2021.02.23 |