https://www.acmicpc.net/problem/15486
15486번: 퇴사 2
첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)
www.acmicpc.net
이 문제는 백준 퇴사(14501)와 같은 알고리즘으로 동작하는 문제이며, 이 해결방법으로도 14501번 문제를 통과할 수 있습니다.
해결방법
다이나믹 프로그래밍으로 해결했다. 이 문제는 마지막 날 부터 상담 건을 진행하면서 '이 날 근무하면 벌 수 있는 최대 금여'를 구하면 해결 할 수 있다.
풀이👀
문제에서 제공하는 예제로 풀이를 진행해보겠습니다.
1일(index: 0) | 2일 (1) | 3일 (2) | 4일 (3) | 5일 (4) | 6일 (5) | 7일 (6) | |
Ti | 3 | 5 | 1 | 1 | 2 | 4 | 2 |
Pi | 10 | 20 | 10 | 20 | 15 | 40 | 200 |
해결방법에 나온 것처럼 점화식은 아래와 같다.
①... (i+t≤N),di=max(di+t+pi,di+1)
②... (i+t>N),di=di+1
dp table의 i번째 elemtary는 i+t번째의 값과 i일 차의 급여의 합이다. 대신에 i+t일이 퇴사날을 넘어가면(N보다 크면) i일 차의 급여는 i+1과 같이 한다.
1. dp table 초기화
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
dp table은 길이가 n+1 만큼 만들고 0으로 모두 초기화 한다.
2-1. 7일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | 0 | 0 | 0 | 0 | d7 | 0 |
n = 7이므로 7일차부터 1일차까지 동작한다. 7일차 상담 일정은 2일이나 걸려서 퇴사날짜보다 길어지기 때문에 상담하지 않는다.
d6은 i+Ti≤N에 대해서 6+2≤7 이므로 ② 조건에 의해 d6 = 0
2-2. 6일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | 0 | 0 | 0 | d6 | 0 | 0 |
5+4>7 에 의해서 ② 조건에 만족하므로 d5=d6이다.
2-3. 5일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | 0 | 0 | max(0+15,0)=15 | 0 | 0 | 0 |
$4+2 \leq 7$에 의해서 ①조건에 만족하므로 d4=max(0+15,0)=15 이다.
2-4. 4일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | 0 | max(15+20,15)=35 | 15 | 0 | 0 | 0 |
$3+1 \leq 7$에 의해서 ①조건에 만족하므로 d3=max(d4+p3,d4)=max(15+20,15)=35이다.
2-5. 3일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | 0 | max(35+10,35)=45 | 35 | 15 | 0 | 0 | 0 |
$2+1 \leq 7$에 의해서 ①조건에 만족하므로 d2=max(d3+p2,d3)=max(35+10,35)=45이다.
2-6. 2일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 0 | max(0+20,45)=45 | 45 | 35 | 15 | 0 | 0 | 0 |
$1+5 \leq 7$에 의해서 ①조건에 만족하므로 d1=max(d6+p1,d2)=max(0+20,45)=45이다.
2-7. 1일차부터 상담하면 벌 수 있는 최대 금액
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | max(35+10,45)=45 | 45 | 45 | 35 | 15 | 0 | 0 | 0 |
$0+3 \leq 7$에 의해서 ①조건에 만족하므로 d0=max(d3+p0,d1)=max(35+10,45)=45이다.
3. 최종 dp table
d0 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | |
MONEY | 45 | 45 | 45 | 35 | 15 | 0 | 0 | 0 |
코드🐱👓
N = int(input())
arr = [tuple(map(int, input().split())) for _ in range(N)]
dp = [0] * (N+1)
for i in range(N-1, -1, -1):
t, p = arr[i]
if i+t > N:
dp[i] = dp[i+1]
continue
dp[i] = max(dp[i+t] + p, dp[i+1])
print(max(dp))
코드 설명
arr에는 튜플 형태로 (상담 시간 t, 수익 p)가 입력된다.
'문제 풀이 > 백준' 카테고리의 다른 글
[G3] 백준 11779 - 최소비용 구하기 2 (Python3) (2) | 2023.12.16 |
---|---|
[G4] 백준 1504 - 특정한 최단 경로 (Python3) (2) | 2023.12.16 |
[S3] 백준 2579 - 계단 오르기 (Python3) (0) | 2023.10.30 |
[G5] 백준 9251 - LCS (python3) (0) | 2023.08.20 |
[G5] 백준 5582 - 공통 부분 문자열 (python3) (0) | 2023.08.19 |
댓글