티스토리 뷰
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
POINT
Dynamic Programing (dp)
피보나치 수열이 대표적인 예시이다. 1. 큰 문제를 작게 나눌 수 있고, 2. 작은 문제에서 구한 결과가 큰 문제에서도 사용되면 Dynamic Programing을 사용한다. 재귀(Top-down), 반복(Bottom-up) 두 가지 방법이 있으며, 시간 복잡도를 고려해서 보통 반복문을 사용한다.
풀이
- 특이한 점은 dp를 거꾸로 적용해야 한다는 점이다.
- i 번째 날 수익이 그 이후 i + t번째 날에 영향을 받기 때문이다.
- i 번째 날의 수익을 더할지 말지 판단할 때, 그 상담이 끝난 후가 퇴사 전이어야 수익을 더할 수 있다.
- 반대로 i 번째 날 상담이 끝나기 전에 퇴사한다면, 그 날 수익은 다음 날 수익을 그대로 가져온다.
- dp에 거꾸로 저장할 때는 입력받은 N개의 데이터를 0 ~ (N-1)에 저장한다.
입력 예시를 사용하여 아래 코드를 수행한 dp의 결과는 다음과 같다.
T | 3 | 5 | 1 | 1 | 2 | 4 | 2 | |
P | 10 | 20 | 10 | 20 | 15 | 40 | 200 | |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
dp | 45 | 45 | 45 | 35 | 15 | 0 | 0 | 0 |
N = int(input())
T = []
P = []
dp = [0] * (N+1)
for _ in range(N):
t, p = map(int, input().split())
T.append(t)
P.append(p)
for i in range(N-1, -1, -1):
# 퇴사 하기 전에 상담이 끝나지 않으면
if i + T[i] > N:
dp[i] = dp[i+1]
# 상담이 끝나도 퇴사 전이면
else:
dp[i] = max(dp[i+1], dp[i+T[i]] + P[i])
print(dp[0])
'🧩 알고리즘' 카테고리의 다른 글
[백준] 18428 감시 피하기 - Node.js (1) | 2023.05.02 |
---|---|
[백준] 14888 연산자 끼워넣기 - Node.js (0) | 2023.05.01 |
[백준] 6603 로또 - Python (0) | 2022.11.14 |
[백준] 1182 부분수열의 합 - Python (0) | 2022.11.14 |
[백준] 듣보잡 - Python (0) | 2022.11.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- python
- React
- 이벤트루프
- backtracking
- javascript
- 코드분석
- nodeJS
- dfs
- 문제풀이
- rn
- React-native
- 코어자바스크립트
- 프로그래머스
- 알고리즘
- Spotify
- fetch
- node.js
- 코테
- Python3
- React.js
- Unsplash
- 백준
- 다이나믹프로그래밍
- 비동기
- p5js
- DP
- 백트래킹
- 파이썬
- 코딩테스트
- flutter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함