Algorithm/Baekjoon

[λ°±μ€€] (Swift) 9465번 - μŠ€ν‹°μ»€ (dp 풀이)

감자 πŸ₯” 2022. 3. 25. 00:29
λ°˜μ‘ν˜•

문제 링크

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

 

9465번: μŠ€ν‹°μ»€

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” n (1 ≤ n ≤ 100,000)이 주어진닀. λ‹€μŒ 두 μ€„μ—λŠ” n개의 μ •μˆ˜κ°€ 주어지며, 각 μ •μˆ˜λŠ” κ·Έ μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” μŠ€ν‹°μ»€μ˜

www.acmicpc.net

 

풀이 IDEA

μ΄λ ‡κ²Œ λ°œκ²¬ν•œ 점화식은 μ•„λž˜μ™€ κ°™λ‹€. μ—¬κΈ°μ„œ dp λŠ” μœ„μ— 그림으둜 λ‚˜νƒ€λ‚Έ μ΅œλŒ€κ°’λ“€μ„ μ €μž₯ν•˜λŠ” 배열이고, arr λŠ” μš°λ¦¬κ°€ μž…λ ₯받은 μŠ€ν‹°μ»€λ“€μ˜ 가격이 λͺ…μ‹œλ˜μ–΄μžˆλŠ” 배열이닀.

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

ν•΄λ‹Ή 점화식을 ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν’€λ©΄ λœλ‹€.

 

μ†ŒμŠ€μ½”λ“œ  - λ§žμ•˜μŠ΅λ‹ˆλ‹€!

  • λ‚˜λŠ” sticker λΌλŠ” ν•¨μˆ˜λ₯Ό 톡해 dp λ₯Ό κ΅¬μ„±ν–ˆλ‹€.
  • 그리고 for 문을 μ΄μš©ν•΄μ„œ μŠ€ν‹°μ»€λ“€μ˜ 배열을 μž…λ ₯λ°›μ•˜λ‹€.
let count = Int(readLine()!)!

for _ in 1...count {
    let n = Int(readLine()!)!
    var arr: [Array<Int>] = []
    for _ in 0...1 {
        let input = readLine()!.split(separator: " ").map { Int(String($0))! }
        arr.append(input)
    }
    
    let result = sticker(n: n, arr: arr)
    
    if n == 1 {
        print(max(result[0][0], result[1][0]))
    } else if n == 2 {
        print(max(result[0][1], result[1][1]))
    } else {
        print(max(result[0][n-1], result[1][n-1]))
    }
}


func sticker(n: Int, arr: Array<Array<Int>>) -> Array<Array<Int>> {
    var dp = Array(repeating: Array(repeating: 0, count: n), count: 2)
    dp[0][0] = arr[0][0]
    dp[1][0] = arr[1][0]
    
    if n > 1 {
        dp[0][1] = arr[1][0] + arr[0][1]
        dp[1][1] = arr[0][0] + arr[1][1]
        
        for i in 2..<n {
           dp[0][i] = max(dp[1][i-1] + arr[0][i], dp[1][i-2] + arr[0][i])
           dp[1][i] = max(dp[0][i-1] + arr[1][i], dp[0][i-2] + arr[1][i])
           
        }
    }
    return dp
}
λ°˜μ‘ν˜•