난이도 : ●●○ | 풀이 시간 : 30분 | 시간 제한 : 2초 | 메모리 제한 : 128MB | 기출 : 삼성전자 SW 역량테스트
문제
- 백준이는 N+1일에 퇴사하기 위해서 남은 N일 동안 최대한 많은 상담을 하려고 한다.
- 각각의 상담을 완료하는 데에 걸리는 기간 Ti, 상담을 하고 받을 수 있는 금액 Pi가 주어진다.
- 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하라.
입력조건
- 첫째 줄에 N(1<=N<=15)이 주어진다.
- 둘째 줄부터 N개의 줄에 Ti, Pi가 공백으로 구분되어 주어진다.
출력조건
- 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
입력예시
7
3 10
5 20
1 10
1 20
2 15
4 40
2 200
출력예시
45
아이디어
- 3일이 걸리는 1일 차 상담을 한다면 최대 이익은 '1일 차의 상담 금액 + 4일부터의 최대 상담 금액'이 된다.
- 이를 활용해서 뒤에서부터 거꾸로 구해나가면 된다.
- max(최대 상담 금액, dp[t[i]+i]+p[i])
- 이를 활용해서 뒤에서부터 거꾸로 구해나가면 된다.
코드
n = int(input())
t = []
p = []
dp = [0]*(n+1)
max_value = 0
for _ in range(n):
x,y=map(int,input().split())
t.append(x)
p.append(y)
# n-1번째부터 0번째까지
for i in range(n-1,-1,-1):
# 상담이 끝나는 시간을 계산
# 현재 시간 i + 이 상담에 걸리는 시간 t[i]
time = t[i]+i
# 상담이 시간안에 끝난다면
if time<=n:
# time일까지 받은 금액+이 상담을 해서 받는 금액과
# 기존 최대금액 중 더 큰 것으로 갱신
dp[i] = max(p[i]+dp[time],max_value)
# 최대금액 갱신
max_value = dp[i]
else:
# 상담이 시간안에 끝나지 않는다면 기존 최대금액을 그대로
dp[i] = max_value
print(max_value)
후기
- 처음에는 dp문제를 보면 어떻게 풀어야 하나 감이 안왔는데, 이제는 이거 냅색 알고리즘같은데..하는 데까지는 생각이 미쳐서 뿌듯하다.
'Algorithm > [이코테] 알고리즘 유형별 기출문제' 카테고리의 다른 글
[이코테] 다이나믹 프로그래밍 문제 - 못생긴 수 python (1) | 2023.11.26 |
---|---|
[이코테] 다이나믹 프로그래밍 - 정수 삼각형 python (1) | 2023.11.24 |
[이코테] DFS/BFS 구현문제 - 인구 이동 python (0) | 2023.11.17 |
[이코테] 정렬 문제 - 실패율 python (0) | 2023.11.05 |
[이코테] 정렬 문제 - 안테나 python (0) | 2023.11.05 |