๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/Algorithm

[Algorithm/Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.3) - ์Šคํ‹ฐ์ปค ๋ชจ์œผ๊ธฐ(2)

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค! 

์˜ค๋Š˜์€ <ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.3) - ์Šคํ‹ฐ์ปค ๋ชจ์œผ๊ธฐ(2)> ๋ฌธ์ œ ํ’€์ด๋ฅผ ํ†ตํ•ด dp ์œ ํ˜• ํ’€์ด ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋Œ€ํ‘œ์ ์ธ dp ์œ ํ˜•์ด๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์–ด ์ •๋ฆฌํ•ด๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค!

๋ฌธ์ œ ๋งํฌ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌธ์ œ ํ’€์ด

์ฒ˜์Œ ์ ‘๊ทผ

์ €๋Š” ์ฒ˜์Œ์— ํˆฌํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผ์„ ํ–ˆ์—ˆ๋Š”๋ฐ์š”,, ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ dp๋กœ ํ•ด๊ฒฐํ•œ ํ›„ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ dp๋กœ ํ’€ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๋ฌธ์ œ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..! ์ฒ˜์Œ์— ํˆฌํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•œ ์ด์œ ๋Š” start, end ํฌ์ธํ„ฐ ๋ชจ๋‘ 0์— ๋‘๊ณ  ์‹œ์ž‘ํ•ด์„œ ์ฒ˜์Œ์œผ๋กœ ๋–ผ๋Š” ์Šคํ‹ฐ์ปค์˜ ์ธ๋ฑ์Šค์— start ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ  end ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ 2์”ฉ ๋Š˜๋ ค๊ฐ€๋ฉด์„œ(์ธ์ ‘ ์ธ๋ฑ์Šค์˜ ์Šคํ‹ฐ์ปค๋Š” ๋–ผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ) ์ฒดํฌํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ start๊ฐ€ 0์ธ ๊ฒฝ์šฐ, 1์ธ ๊ฒฝ์šฐ(์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ๋Š๋ƒ, ๋‘๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ๋Š๋ƒ) ๋‘ ๋ฒˆ ์ฒดํฌํ•ด์„œ ๋น„๊ตํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ!! ํ’€๊ณ  ๋‚˜์„œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ํ•˜๋‚˜ ๊ฑด๋„ˆ ํ•˜๋‚˜์”ฉ ๋–ผ๋Š” ๊ฒฝ์šฐ๋งŒ ์ฒดํฌํ•ด์ฃผ๋ฉด ํ™•์ธ ๋ชปํ•˜๊ฒŒ ๋˜๋Š” ์ผ€์ด์Šค([1, 100, 1, 1, 100] ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ )๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ฒ ๋”๋ผ๊ตฌ์š”.. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ dp ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ํ’€์ดํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค!

DP๋ฅผ ํ™œ์šฉํ•œ ํ’€์ด ๊ณผ์ •

dp ๋ฌธ์ œ๋Š” dp ์œ ํ˜•์ธ์ง€๋งŒ ์ž˜ ํŒŒ์•…ํ•˜๋ฉด(๋„ค ์ด๊ฒŒ ์–ด๋ ต์ง€๋งŒ์š”) ์ ํ™”์‹๋งŒ ์ž˜ ์„ธ์šฐ๋ฉด ๊ฒฐ๊ณผ ๊ฐ’์„ ๋„์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ ํ™”์‹์„ ์„ธ์šฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทœ์น™์„ ์ž˜ ํŒŒ์•…ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ??

์ด ๋ฌธ์ œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™์€, ์ผ๋‹จ ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์—ˆ์„ ๊ฒฝ์šฐ์™€ ๋œฏ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ ๋‚˜๋‰œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋œฏ์€ ์Šคํ‹ฐ์ปค์— ์ ํžŒ ์ˆซ์ž๋“ค์˜ ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด์„ ๋‘ ๊ฐœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. (dp1, dp2)

์ด ๋‘ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” sticker ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™๊ณ  ์ธ๋ฑ์Šค์—๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋œฏ์€ ์Šคํ‹ฐ์ปค์— ์ ํžŒ ์ˆซ์ž๋“ค์˜ ํ•ฉ์ด ์ €์žฅ๋˜๊ณ , (๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•) ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋œฏ์€ ์Šคํ‹ฐ์ปค์˜ ์ธ๋ฑ์Šค์— ์ตœ์ข… ๊ฐ’์ด ์ €์žฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์€ ๊ฒฝ์šฐ(dp1), sticker[0] ์ž๋ฆฌ์˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— dp1[0]์— sticker[0] ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๊ณ , ๋ฐ”๋กœ ์˜† ์Šคํ‹ฐ์ปค์ธ dp1[1]์€ ๋œฏ์ง€ ๋ชปํ•˜๋Š” ์Šคํ‹ฐ์ปค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋˜‘๊ฐ™์ด sticker[0]์˜ ๊ฐ’์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์ง€ ์•Š์€ ๊ฒฝ์šฐ(dp2), ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— dp[1]์— ์ผ๋‹จ sticker[1]์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ ๋‹ค์Œ, for ๋ฌธ์„ ์ด์šฉํ•ด ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„(์ฒซ๋ฒˆ์งธ๋ฅผ ๋œฏ์€ ๊ฒฝ์šฐ๋Š” ๋งˆ์ง€๋ง‰ ์Šคํ‹ฐ์ปค ๋ชป๋œฏ๊ธฐ ๋•Œ๋ฌธ์— n-2๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€)๊นŒ์ง€ ๊ฒ€์‚ฌํ•ด์ค๋‹ˆ๋‹ค.

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

 

for๋ฌธ์—์„œ ์ด์šฉํ•˜๊ฒŒ ๋˜๋Š” ์ ํ™”์‹์€ i๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ๋Š” ๊ฒƒ์ด ์ข‹์„์ง€ ์•„๋‹์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

i๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋—„ ๊ฒฝ์šฐ, i-1๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋Š” ๋–ผ์ง€ ๋ชปํ•˜๋ฏ€๋กœ dp[i-2] + sticker[i]๊ฐ€ ์ตœ์ ์ด ๋˜๊ณ ,

๋–ผ์ง€ ์•Š์„ ๊ฒฝ์šฐ๋Š” dp[i-1]์ด ์ตœ์ ์ด ๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— dp[i]์— ์ €์žฅ๋˜๋Š” ๊ฐ’(= ๋ˆ„์  ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’)์œผ๋กœ dp[i-2] + sticker[i] ์™€ dp[i-1] ์ค‘ ํฐ ๊ฐ’์„ ๊ณจ๋ผ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Swift ํ’€์ด ์ฝ”๋“œ

import Foundation

func solution(_ sticker:[Int]) -> Int{  
    let n = sticker.count
    
    if n <= 2 {
        return sticker.max()!
    }
  
    var dp1 = Array(repeating: 0, count: n)
    var dp2 = Array(repeating: 0, count: n)
  
    // ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์—ˆ์„ ๊ฒฝ์šฐ
    dp1[0] = sticker[0]
    dp1[1] = sticker[0]
  
    // ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
    dp2[0] = 0
    dp2[1] = sticker[1]
  
    for i in 2..<n {
        dp2[i] = max(dp2[i-2] + sticker[i], dp2[i-1])
    
        if i < n - 1 {
        dp1[i] = max(dp1[i-2] + sticker[i], dp1[i-1])
        }
    }
  
    return max(dp1[n-2], dp2[n-1])
}

[์ฐธ๊ณ  ์ž๋ฃŒ]

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ์Šคํ‹ฐ์ปค ๋ชจ์œผ๊ธฐ(2) - Swift

https://school.programmers.co.kr/learn/courses/30/lessons/12971์ „ํ˜•์ ์ธ dp๋ฌธ์ œ๊ณ , ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์—ˆ์„๊ฒฝ์šฐ, ์•ˆ๋œฏ์—ˆ์„ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ  ํ’€๋ฉด ๋œ๋‹ค

velog.io