Problem Solving/BOJ & Programmers

[BOJ] 14501번: 퇴사

geum 2024. 2. 5. 08:52

문제

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

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

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

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

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이닀.

상담을 적절히 ν–ˆμ„ λ•Œ, 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ μˆ˜μ΅μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…μΆœλ ₯ μ˜ˆμ‹œ

 

풀이

사싀 이 문제λ₯Ό 직접 ν’€μ§€λŠ” λͺ»ν–ˆκ³  λ‹€λ₯Έ λΆ„λ“€μ˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄μ„œ μ„  제좜 ν›„ 볡슡 쀑이닀. 사싀 이 문제λ₯Ό 처음 봀을 λ•Œ 'μ΅œλŒ€ 수읡'만 보고 그리디 μœ ν˜•μΈ 쀄 μ•Œμ•˜λŠ”λ° DP둜 λΆ„λ₯˜λ˜μ–΄ 있길래 DP둜 λŒ€μ²΄ μ–΄λ–»κ²Œ ν’€μ–΄μ•Ό ν•˜μ§€? μ‹Άμ—ˆλ‹€.

 

일단 μ—¬λŸ¬ μ½”λ“œλ₯Ό 봀을 λ•Œ λ‘œμ§μ€ κ³΅ν†΅μ μœΌλ‘œ μ„Έ λ‹¨κ³„μ˜€λ‹€.


1. dpλΌλŠ” λ°°μ—΄μ„ μƒμ„±ν•˜μ—¬, κ° μΈλ±μŠ€μ— ν•΄λ‹Ήν•˜λŠ” λ‚ μ§œκΉŒμ§€ μ–»μ„ μˆ˜ μžˆλŠ” μ΅œλŒ€ μˆ˜μ΅μ„ μ €μž₯
2. λ°°μ—΄μ„ λŒλ©΄μ„œ κ° λ‚ μ§œμ—μ„œ μ‹œμž‘ν•˜λŠ” μƒλ‹΄μ΄ ν‡΄μ‚¬μΌμ„ λ„˜μ§€ μ•ŠλŠ” κ²½μš°, κ·Έ μƒλ‹΄μ„ μ§„ν–‰ν–ˆμ„ λ•Œμ™€ ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ μˆ˜μ΅μ„ λΉ„κ΅ν•˜μ—¬ dp λ°°μ—΄ μ—…λ°μ΄νŠΈ
3. λͺ¨λ“  λ‚ μ§œμ— λŒ€ν•œ 계산이 λλ‚˜λ©΄ dp λ°°μ—΄μ˜ μ΅œλŒ€κ°’μ΄ μ΅œλŒ€ 수읡이 됨

λ‚˜λŠ” 2번 κ³Όμ •(=dp 배열을 μ—…λ°μ΄νŠΈν•˜λŠ” 방법)을 λ– μ˜¬λ¦¬μ§€ λͺ»ν•΄μ„œ 문제 풀이 진도가 μ•ˆ λ‚˜κ°„ 것 κ°™λ‹€. 일단 DPλŠ” 상ν–₯식(bottom-up)κ³Ό ν•˜ν–₯식(top-down)으둜 λ‚˜λˆŒ 수 있기 λ•Œλ¬Έμ— 두 가지 과정을 λͺ¨λ‘ 정리해보렀고 ν•œλ‹€.

 

1) Bottom-up

# Silver 3

import sys

N = int(input())

schedule = [] # [상담기간, λΉ„μš©]을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ°°μ—΄

for _ in range(N):
    schedule.append(list(map(int, sys.stdin.readline().split())))
    
dp = [0]*(N+1) # μˆ˜μ΅μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ°°μ—΄

for i in range(N):
    time, pay = schedule[i]
    
    if i+time <= N: # 상담 기간이 퇴사일을 λ„˜μ§€ μ•ŠλŠ” 경우
        dp[i+time] = max(dp[i+time], dp[i]+pay) # 상담 진행
        
    dp[i+1] = max(dp[i+1], dp[i]) # 상담 진행 X
  
print(dp[N])

 

μ—¬κΈ°μ„œ 18번 라인, 20번 라인의 역할을 μ΄ν•΄ν•˜κΈ°κ°€ μ’€ μ–΄λ €μ› μ–΄μ„œ ChatGPTν•œν…Œ λ¬Όμ–΄λ΄€λ‹€.

 

dp[i+time] = max(dp[i+time], dp[i]+pay)

β—Ύ νŠΉμ • λ‚ μ§œμ— 상담을 μ§„ν–‰ν•˜κΈ°λ‘œ ν–ˆμ„ λ•Œμ˜ μ΅œλŒ€ 수읡 계산

β—Ύ ν˜„μž¬ κ³ λ € 쀑인 상담을 μˆ˜ν–‰ν•˜κ³  λ‚œ ν›„μ˜ 수읡 dp[i]+pay와 i+time λ‚ μ§œμ— κ³„μ‚°λœ μ΅œλŒ€ 수읡 dp[i+time] 쀑 더 큰 값을 dp[i+time]에 μ €μž₯

 

dp[i+1] = max(dp[i+1], dp[i])

β—Ύ νŠΉμ • λ‚ μ§œμ— 상담을 μ§„ν–‰ν•˜μ§€ μ•Šμ„ 경우, 이전 λ‚ μ§œκΉŒμ§€μ˜ μ΅œλŒ€ μˆ˜μ΅μ„ κ·ΈλŒ€λ‘œ λ‹€μŒ λ‚ μ§œλ‘œ λ„˜κΉ€

β—Ύ μ–΄λ–€ 날에 상담을 ν•  수 μ—†κ±°λ‚˜ 상담을 ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν–ˆλ‹€λ©΄ κ·Έ λ‚ μ˜ μˆ˜μ΅μ€ μ „λ‚  수읡과 κ°™κΈ° λ•Œλ¬Έ

 

2) Top-down

# Silver 3

import sys

N = int(input())

schedule = []

for _ in range(N):
    schedule.append(list(map(int, sys.stdin.readline().split())))
    
dp = [0] * (N+1)

for i in range(N-1, -1, -1):
    time, pay = schedule[i]

    if i + time <= N:
        dp[i] = max(pay + dp[i+time], dp[i+1])
    else:
        dp[i] = dp[i+1]

print(dp[0])

 

Bottom-up 방식과 λ‘œμ§μ€ κ°™κ³  λ°©ν–₯만 λ°”λ€ŒλŠ” κ±°μ§€λ§Œ forλ¬Έ μ•ˆμ˜ 쑰건문 λ‚΄μš©λ„ 살짝 차이가 μžˆλ‹€.

 

dp[i] = max(dp[i+time]+pay, dp[i+1])

β—Ύ dp[i+time]+payλŠ” ν˜„μž¬ 상담을 μ„ νƒν–ˆμ„ λ•Œμ˜ 수읡 pay와 상담이 λλ‚˜λŠ” λ‚  i+time μ΄ν›„μ˜ μ΅œλŒ€ 수읡 dp[i+time]을 λ”ν•œ κ°’

β—Ύ dp[i+1]은 ν˜„μž¬ 상담을 μ„ νƒν•˜μ§€ μ•Šκ³  λ‹€μŒ λ‚ λ‘œ λ„˜μ–΄κ°”μ„ λ•Œμ˜ μ΅œλŒ€ 수읡

 

 

이제 이 문제 풀이 정리해둔 κ±° 가지고 DP μœ ν˜• 많이 풀어봐야겠닀⭐

'Problem Solving > BOJ & Programmers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 2839번: 섀탕 배달  (1) 2024.08.27
[BOJ] 2217번: λ‘œν”„  (1) 2024.02.25
[BOJ] 2960번: RESETO  (0) 2024.01.18
[BOJ] 15686번: μΉ˜ν‚¨ 배달  (0) 2024.01.16
[BOJ] 1789번: μˆ˜λ“€μ˜ ν•©  (1) 2024.01.02