Algorithm/Baekjoon

[λ°±μ€€] (Swift) 14501번 - 퇴사 (λ‘λ²ˆμ§Έ 풀이, DP)

감자 πŸ₯” 2023. 1. 20. 11:24
λ°˜μ‘ν˜•

🟠 문제

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

 

14501번: 퇴사

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

www.acmicpc.net

🟠 문제 풀이

이전에 봀던 λ¬Έμ œμ˜€λ˜κ²Œ 기얡났닀. λ¬Έμ œλŠ” λ”± 보자마자 dp μž„μ„ νŒŒμ•… ν•  수 μžˆμ—ˆλ‹€. λ‚΄κ°€ ν‰μ†Œμ— μ’‹μ•„ν•˜λ˜ dp μœ ν˜•μ΄μ—ˆλ‹€!

μ΄λ ‡κ²Œ 풀이λ₯Ό 생각해내고, μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
    arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 21) // μ΅œλŒ€ N -> 15일, 상담 term μ΅œλŒ€ 5일

for i in 1..<n+1 {
    if i+arr[i][0] > n {
        continue
    }
    dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i])
}

print(dp.max()!)

μ΄λ ‡κ²Œ ν‘Έλ‹ˆκΉŒ ν‹€λ Έλ‹€κ³  λœ¨λŠ” 것이닀.... μ™œμ§€??

곰곰히 μƒκ°ν•΄λ³΄λ‹ˆκΉŒ, μ•„λž˜μ™€ 같은 경우λ₯Ό λ‚˜λŠ” νŒλ‹¨ν•˜μ§€ μ•Šμ•˜λ‹€. 4일차에 μƒˆλ‘œμš΄ 상담을 μ§„ν–‰ν•˜μ§€ μ•Šκ³ , μ΄μ „μ˜ 값이 μœ μ§€λ˜λŠ”κ²Œ 더 큰 경우λ₯Ό μƒκ°ν•˜μ§€ μ•Šμ•˜λ˜ 것이닀.

이런 κ²½μš°κΉŒμ§€ λͺ¨λ‘ ν¬ν•¨μ‹œμΌœμ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ–΄μ•Όν–ˆλ‹€. λ‹€μŒγ„΄

let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
    arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 21) // μ΅œλŒ€ N -> 15일, 상담 term μ΅œλŒ€ 5일

for i in 1..<n+1 {
    if i+arr[i][0] > n+1 {
        continue
    }

    if dp[i] > dp[i+1] {
        dp[i+1] = dp[i]
    }

    dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i+arr[i][0]])
}
print(dp.max()!)

μ΄λ ‡κ²Œ κ°€μš΄λ° if 문을 μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€. λ‚΄μΌμ˜ κΈˆμ•‘μ΄ 였늘의 κΈˆμ•‘λ³΄λ‹€ μž‘μœΌλ©΄, 였늘의 κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ 이월(?)ν•΄μ„œ κ°€μ Έκ°€λ©΄ 되기 λ•Œλ¬Έμ— dp[i+1]에 dp[i]λ₯Ό λ„£μ–΄μ£Όμ—ˆλ‹€.

μ—¬κΈ°μ„œ 또 ν‹€λ Έλ‹€.... μ™œ... λ„λŒ€μ²΄ 또 μ™œ .. 뭐가문젠데... μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ‹ˆκΉŒ, 첫번째 if문이 λ¬Έμ œμ˜€λ‹€. for문에 μ§„μž…ν•˜μžλ§ˆμž ifλ₯Ό ν†΅ν•΄μ„œ n+1이 λ„˜μ–΄κ°€λŠ”μ§€ νŒλ‹¨μ„ ν•΄μ£Όκ³ , λ„μ„κ²½μš° continueν•΄μ„œ ν•΄λ‹Ή iλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•Šλ„λ‘ 해쀬닀. ν•˜μ§€λ§Œ, 이것은 λ§Œμ•½ n+1을 λ„˜λ”λΌλ„, dp[i]λŠ” μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•΄μ£Όμ–΄μ•Όν•˜λŠ”λ°, 이 λͺ¨λ“  과정을 λ‚ λ €λ¨ΉκΈ° λ•Œλ¬Έμ— 결과값이 λ‹€λ₯΄κ²Œ λ‚˜μ˜¬ 수 밖에 μ—†λ‹€. κ·Έλž˜μ„œ if 문의 μˆœμ„œλ₯Ό λ°”κΏ”μ€˜μ•Ό ν–ˆλ‹€. (λ°”κΎΈλ‹ˆκΉŒ 정닡이닀!) 

🟠 μ •λ‹΅μ½”λ“œ

μ•„,, 쀑간쀑간 인덱슀 κ΄€λ ¨ν•΄μ„œ 였λ₯˜λ„ λ§Žμ•˜κ³ , 이것저것 if문에 λŒ€ν•΄μ„œ μƒκ°ν•˜μ§€ λͺ»ν•œ λΆ€λΆ„...이 λ§Žμ•˜μ–΄μ„œ ꡉμž₯히 많이 ν‹€λ Έλ‹€. γ…‹γ…‹γ…‹γ…‹γ…‹ ν•˜... λ‘λ²ˆμ§Έ 풀이인데 와케 μ©”μ©”λ§€λŠ”κ±°μ§€ ν•˜μ§€λ§Œ κ·Έλž˜λ„ ν•΄λƒˆλ‹€!

import Foundation

let n = Int(readLine()!)!
var arr = [[0, 0]]
for _ in 0..<n {
    arr.append(readLine()!.split(separator: " ").map{ Int($0)! })
}
var dp = Array(repeating: 0, count: 100)

for i in 1..<n+1 {
    if dp[i] > dp[i+1] {
        dp[i+1] = dp[i]
    }

    if i+arr[i][0] > n+1 {
        continue
    }

    dp[i+arr[i][0]] = max(arr[i][1] + dp[i], dp[i+arr[i][0]])
}

print(dp.max()!)

 

dp.max()!값을 뽑지 μ•Šκ³ , dp[n+1]값을 뽑아도 λœλ‹€~ 

λ°˜μ‘ν˜•