본문 바로가기

알고리즘/백준

[백준] 15486번 : 퇴사 2

728x90

15486번: 퇴사 2

 

15486번: 퇴사 2

첫째 줄에 N (1 ≤ N ≤ 1,500,000)이 주어진다. 둘째 줄부터 N개의 줄에 Ti와 Pi가 공백으로 구분되어서 주어지며, 1일부터 N일까지 순서대로 주어진다. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

www.acmicpc.net

🤔 문제분석

1차원 dp 테이블을 가지고 문제를 해결 할 수 있다. 시간과 금액을 순회하는데 i번째 순회에서의 dp값을 갱신하는 방법은 dp[i+t] = 현재까지의 최대가치 + p로 표현할 수 있다. 해당문제는 현재까지의 최대 가치를 생각해내는 것이 제일 중요한 포인트이다.

예를들어 아래의 표를 살펴보자, i가 5일때 생각해보면, dp[5+5일의시간] = 5일까지 최대 갖을 수 있는 금액 + 5일의 금액 으로 표현 할 수 있다.

💻 코드

import sys
input = sys.stdin.readline

N = int(input())

dp = [0 for _ in range(N+2)]
prev = 0

for i in range(1, N+1):
    t, p = map(int, input().split())
    
    if dp[i] > prev:
        prev = dp[i]
        
    if N+1 >= i + t:
        dp[i+t] = max(dp[i+t], prev + p)

print(max(prev, dp[N+1]))

🎯 피드백 및 개선사항

이번문제도 다이나믹 프로그래밍 유형중 하나로, 여러가지 방안으로 생각해보며 어떻게 문제를 풀지 고민하는 시간이 저에게 큰 도움이 된 것 같습니다. 점점 다이나믹 프로그래밍 문제에 자신감을 갖게 되는것 같습니다 👏👏👏

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2056번 : 작업  (0) 2024.01.28
[백준] 2169번 : 로봇 조종하기  (1) 2024.01.24
[백준] 13398번 : 연속합 2  (1) 2024.01.22
[백준] 1256번 : 사전  (0) 2024.01.21
[백준] 2240번 : 자두나무  (0) 2024.01.21