JB의 이모저모
[BOJ 15486 🥇5] 퇴사 2(Python) 본문
https://www.acmicpc.net/problem/15486
문제
상담원으로 일하고 있는 백준이는 퇴사를 하려고 한다.
오늘부터 N+1일째 되는 날 퇴사를 하기 위해서, 남은 N일 동안 최대한 많은 상담을 하려고 한다.
백준이는 비서에게 최대한 많은 상담을 잡으라고 부탁을 했고, 비서는 하루에 하나씩 서로 다른 사람의 상담을 잡아놓았다.
각각의 상담은 상담을 완료하는데 걸리는 기간 Ti와 상담을 했을 때 받을 수 있는 금액 Pi로 이루어져 있다.
N = 7인 경우에 다음과 같은 상담 일정표를 보자.
1일 | 2일 | 3일 | 4일 | 5일 | 6일 | 7일 | |
Ti | 3 | 5 | 1 | 1 | 2 | 4 | 2 |
Pi | 10 | 20 | 10 | 20 | 15 | 40 | 200 |
1일에 잡혀있는 상담은 총 3일이 걸리며, 상담했을 때 받을 수 있는 금액은 10이다. 5일에 잡혀있는 상담은 총 2일이 걸리며, 받을 수 있는 금액은 15이다.
상담을 하는데 필요한 기간은 1일보다 클 수 있기 때문에, 모든 상담을 할 수는 없다. 예를 들어서 1일에 상담을 하게 되면, 2일, 3일에 있는 상담은 할 수 없게 된다. 2일에 있는 상담을 하게 되면, 3, 4, 5, 6일에 잡혀있는 상담은 할 수 없다.
또한, N+1일째에는 회사에 없기 때문에, 6, 7일에 있는 상담을 할 수 없다.
퇴사 전에 할 수 있는 상담의 최대 이익은 1일, 4일, 5일에 있는 상담을 하는 것이며, 이때의 이익은 10+20+15=45이다.
상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다.
둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)
출력
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
예제 입력 1
7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
예제 출력 1
45
예제 입력 2
10
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
예제 출력 2
55
예제 입력 3
10
5 10
5 9
5 8
5 7
5 6
5 10
5 9
5 8
5 7
5 6
예제 출력 3
20
예제 입력 4
10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50
예제 출력 4
90
⭕ CODE
n = int(input())
arr = [[0, 0]]
for _ in range(n):
t, p = map(int, input().split())
arr.append([t, p])
# d[i] -> i일날 까지 일했을 때 최대금액
d = [0] * (n + 1)
for i in range(1, n+1):
# i날의 최대는 그 전날이랑 같거나 클테니
d[i] = max(d[i - 1], d[i])
# i날에 일 시작한다고 생각하면
# (i + arr[i][0] - 1) 일날 끝난다.
# 그러므로 i + arr[i][0] - 1 <= n을 만족하면
# n일날 끝나야지 n+1일날 퇴사한다
if i + arr[i][0] - 1 <= n:
# 끝나는 날짜의 최대값은
# 끝나는 날짜의 최대 와 i-1일에서최대값 + i일만큼 일하는 금액
d[i + arr[i][0] - 1] = max(d[i + arr[i][0] - 1], d[i-1] + arr[i][1])
# 최대값은 끝나는 날과 같을테니
print(d[-1])
✏️ Comment
문제를 보자마자 dp임을 알았고 가장 중요한 정보는 i일날 일을 시작했으면 그 시작날 걸리는 날짜를 더했을 때 n일안에는 끝내야 한다는 사실이었다.
i일날 일을 시작하면 i일도 포함이므로 끝나는 날은 i + arr[i][0] - 1 이 된다.
- dp는 항상 어렵다. 많이 풀자
- index 에러가 많이 난다. 항상 index에 신경쓰자
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 16724🥇3] 피리 부는 사나이(Python) (2) | 2023.09.06 |
---|---|
[BOJ 1918 🥇2] 후위 표기식(Python) (0) | 2023.09.05 |
[BOJ 21317 🥈1] 징검다리 건너기 (Python) (0) | 2023.09.05 |
[BOJ 16234🥇4] 인구 이동(Python) (0) | 2023.09.04 |
[BOJ 9613🥈4] GCD 합(Python) (0) | 2023.09.04 |