Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 2579๋ฒˆ - ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ (์‹ค๋ฒ„3, DP)

๊ฐ์ž ๐Ÿฅ” 2023. 3. 30. 22:25
๋ฐ˜์‘ํ˜•

 

โšซ๏ธ ๋ฌธ์ œ

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

 

2579๋ฒˆ: ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๊ฒŒ์ž„์€ ๊ณ„๋‹จ ์•„๋ž˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๊ณ„๋‹จ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒŒ์ž„์ด๋‹ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์ผ์ •ํ•œ ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”๋ฐ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด ๊ทธ ๊ณ„๋‹จ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ 

www.acmicpc.net

 

โšซ๏ธ ๋‚˜์˜ ์ƒ๊ฐ

์šฐ์„ , ๋งˆ์ง€๋ง‰ ๊ณ„๋‹จ์„ ๊ผญ ๋“ค๋Ÿฌ์•ผํ•œ๋‹ค๊ณ  ํ•œ ์กฐ๊ฑด์ด ๋ˆˆ์— ๋ณด์˜€๋‹ค. ๊ทธ๋Ÿผ? ๊ฒฐ๊ตญ dp[๋งˆ์ง€๋ง‰๊ณ„๋‹จ]์„ ์ถœ๋ ฅํ–ˆ์„๋•Œ์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜! ์ƒ๊ฐํ–ˆ๋‹ค. 

์ด์ „์— dp ์œ ํ˜•์„ ์กฐ๊ธˆ ํ’€์–ด๋ณธ์ ์ด ์žˆ์–ด์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  dp๋ฐฐ์—ด์— ์–ด๋–ค ๊ฒƒ์„ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•˜๋Š”์ง€ ๊ฐ์ด ์™”๋‹ค.

๋‚˜๋Š” dp๋ฅผ ์ด๋ ‡๊ฒŒ ์ •์˜ํ• ๊ฒƒ์ด๋‹ค. 
dp[i] = i๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ ์ตœ๋Œ€ ์ ์ˆ˜

์ด๋ ‡๊ฒŒ ์ •์˜๋ฅผ ํ•ด๋†“๊ณ  ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์„œ ์ƒ๊ฐํ•ด๋ดค๋‹ค. ์šฐ์„ , ์—ฐ๋‹ฌ์•„์„œ ์„ธ ์นธ์„ ์šฐ๋ฆฌ๋Š” ๊ฐˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์žˆ๋Š” ์œ„์น˜๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ ๋‘๊ฐ€์ง€์™€ ๊ฐ™๋‹ค.

1. 3๋ฒˆ์งธ ์ „ ์นธ → ๋ฐ”๋กœ์•ž์นธ → ํ˜„์žฌ์œ„์น˜
2. 2๋ฒˆ์งธ์ „ → ํ˜„์žฌ์œ„์น˜ (๋‘๋ฒˆ์งธ ์ „ ์นธ์—์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ „์— ์–ด๋–ป๊ฒŒ ์›€์ง์˜€๋“  ์ƒ๊ด€์—†๋‹ค.)

์Œ.. ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ตœ๋Œ€๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ• ๊นŒ? ์•ž์—์„œ dp์— ํ•ด๋‹น ์นธ์ˆ˜๊นŒ์ง€ ์˜ค๋Š”๋ฐ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค. ํ˜„์žฌ์˜ ์นธ์ˆ˜๊นŒ์ง€ ์˜ค๋Š”๋ฐ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•˜๋Š” dp ํ…Œ์ด๋ธ”์€ ์ž‘์€๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๊ฐ€๋ฉด์„œ ์ตœ์ข… ์œ„๋กœ ์˜ฌ๋ผ์˜ค๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ dp ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ bottom-up ์ƒํ–ฅ์‹ ๋ฐฉ์‹์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.  (๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์€ ์•„๋ž˜ ๋…ธ์…˜๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ณด์ž. ๋‚˜๋™๋นˆ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค)

https://desert-opossum-095.notion.site/DP-8180a955db954132b9c70b05678cfa15

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (DP)

Contents

desert-opossum-095.notion.site

 

๋‚˜๋Š” ๊ฐ๊ฐ์˜ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ ํ™”์‹์„ ์„ธ์› ๋‹ค. ๋‚˜๋Š” ๊ฒฐ๊ตญ ๊ทธ ์นธ์ˆ˜๊นŒ์ง€ ์˜ค๋Š” '์ตœ๋Œ€'๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฐ€์ง€ ์ ํ™”์‹ ์ค‘, max ๊ฐ’์„ ์„ ํƒํ•ด์„œ dp ํ…Œ์ด๋ธ”์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. dp[i]๋Š” i๋ฒˆ์žฌ ์นธ์— ์˜ค๋Š” ์ตœ๋Œ€ ์ ์ˆ˜๋งŒ์„ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—!

1. dp[i] = ์ ์ˆ˜[i] + ์ ์ˆ˜[i-1] + dp[i-3]
// ํ•ด๋‹น์นธ ์ ์ˆ˜ + ํ•œ์นธ ์ „ ์ ์ˆ˜ + 3์นธ์ „๊นŒ์ง€ ์˜ค๋Š”๋ฐ ์ตœ๋Œ€ ์ ์ˆ˜ 

2. dp[i] = ์ ์ˆ˜[i] + dp[i-2] 
// ํ•ด๋‹น์นธ ์ ์ˆ˜ + 2์นธ ์ „ ๋†’์ด๊นŒ์ง€ ์˜ค๋Š”๋ฐ ์ตœ๋Œ€ ์ ์ˆ˜

์ด๋ ‡๊ฒŒ ์ ํ™”์‹์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ, ํ•œ๊ฐ€์ง€ ๊ฑธ๋ฆฌ๋Š” ์ ์ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” i-3๊นŒ์ง€ ์ ํ™”์‹์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ, i ๊ฐ€ 0, 1, 2, 3์ผ๋•Œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ์ƒ๊ฐ์„ ํ•ด๋ณด๋‹ˆ๊นŒ, 1๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š”๋ฐ ์ตœ๋Œ€๊ฐ’, 2๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š”๋ฐ ์ตœ๋Œ€๊ฐ’, 3๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š”๋ฐ ์ตœ๋Œ€๊ฐ’์€ ์ •ํ•ด์ ธ์žˆ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ... ๊ทธ๋ž˜์„œ ์ด ๋ชจ๋“ ๊ฒƒ๋“ค์„ dp์— ์ž„์˜๋กœ ๋„ฃ์–ด์ค€๋‹ค.  ์ด ๋ชจ๋“  ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด? ์ •๋‹ต!

โšซ๏ธ ์ •๋‹ต์ฝ”๋“œ

import Foundation

let n = Int(readLine()!)!
var arr = [0]

for _ in 0..<n {
    arr.append(Int(readLine()!)!)
}

var dp = Array(repeating: 0, count: 301)

func solution() -> Int {
    if n == 1 {
        return arr[1]
    } else if n == 2 {
        return arr[1] + arr[2]
    } else if n == 3 {
        return max(arr[1]+arr[3], arr[2]+arr[3])
    } else {
        dp[1] = arr[1]
        dp[2] = arr[1] + arr[2]
        dp[3] = max(arr[1]+arr[3], arr[2]+arr[3])

        for i in 4...n {
            dp[i] = max(arr[i]+arr[i-1]+dp[i-3], dp[i-2]+arr[i])
        }
    }

    return dp[n]
}

print(solution())
๋ฐ˜์‘ํ˜•