Coding

[BOJ] 14501번: 퇴사

λ‚¨λ°”μ˜€ 2023. 3. 13. 14:33

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.

www.acmicpc.net

문제

μƒλ‹΄μ›μœΌλ‘œ μΌν•˜κ³  μžˆλŠ” λ°±μ€€μ΄λŠ” 퇴사λ₯Ό ν•˜λ €κ³  ν•œλ‹€.

μ˜€λŠ˜λΆ€ν„° N+1일째 λ˜λŠ” λ‚  퇴사λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ, 남은 N일 λ™μ•ˆ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 ν•˜λ €κ³  ν•œλ‹€.

λ°±μ€€μ΄λŠ” λΉ„μ„œμ—κ²Œ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 작으라고 뢀탁을 ν–ˆκ³ , λΉ„μ„œλŠ” ν•˜λ£¨μ— ν•˜λ‚˜μ”© μ„œλ‘œ λ‹€λ₯Έ μ‚¬λžŒμ˜ 상담을 μž‘μ•„λ†“μ•˜λ‹€.

각각의 상담은 상담을 μ™„λ£Œν•˜λŠ”λ° κ±Έλ¦¬λŠ” κΈ°κ°„ Ti와 상담을 ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘ Pi둜 이루어져 μžˆλ‹€.

N = 7인 κ²½μš°μ— λ‹€μŒκ³Ό 같은 상담 μΌμ •ν‘œλ₯Ό 보자.

 

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 ≤ 15)이 μ£Όμ–΄μ§„λ‹€.

λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 Ti와 Piκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ„œ μ£Όμ–΄μ§€λ©°, 1일뢀터 NμΌκΉŒμ§€ μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. (1 ≤ Ti ≤ 5, 1 ≤ Pi ≤ 1,000)

좜λ ₯

첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.

 

문제 ν•΄κ²°

dp둜 ν‘ΈλŠ” 방법을 거의 잊고 μžˆμ—ˆλŠ”λ° 이번 문제λ₯Ό ν’€λ©΄μ„œ 곡뢀 μ’€ μ œλŒ€λ‘œ ν•΄μ•Όκ² λ‹€λŠ” 생각을 λ‹€μ‹œ ν•œ 번,,πŸ₯²

 

졜적의 ν•΄λ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ N일만큼 λ‹€ ν•œ λ²ˆμ”© 비ꡐλ₯Ό ν•˜λŠ”λ° 이 λ•Œ 계속 κ³„μ‚°ν•˜λŠ” 것이 μ•„λ‹Œ, 이 μ „κΉŒμ§€μ˜ μ΅œμ ν•΄λ₯Ό μ €μž₯해두고 κ·Έ 해와 λΉ„κ΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ—°μ‚°λŸ‰μ„ 쀄일 수 μžˆλ‹€.

첫 for문을 돌릴 λ•Œ i번째의 상담 κΈ°κ°„(i + TP[i][0])을 더해주고 이읡은 dp[i] + TP[i][1]κ³Ό λΉ„κ΅ν•˜λ©΄μ„œ dpλ₯Ό κ°±μ‹ ν•΄μ€€λ‹€.

κ²°κ³ΌλŠ” 계속 κ°±μ‹ λ˜λ―€λ‘œ 리슀트의 제일 λ§ˆμ§€λ§‰μ„ λ„˜κ²¨μ£Όλ©΄ λœλ‹€.

N = int(input())
TP = [list(map(int, input().split())) for _ in range(N)]

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

for i in range(N):
    for j in range(i+TP[i][0], N+1):
        if dp[j] < dp[i] + TP[i][1]:
            dp[j] = dp[i] + TP[i][1]

print(dp[-1])