๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป iOSun
article thumbnail

๋ฌธ์ œ ์„ค๋ช…

์‰ฝ๊ฒŒ ๋งํ•ด ํ•œ ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ์œผ๋ฉด ์–‘ ์˜†์˜ ์Šคํ‹ฐ์ปค๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.

ํ•ต์‹ฌ์€ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์–ด๋‚ด ์ตœ๋Œ€ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ!

 

ํ’€์ด

์™œ dp์ธ๊ฐ€?

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

๊ทผ๋ฐ ๊ฐ๋งŒ ์˜จ๊ฑฐ์ง€ ์™œ ๋‚ด๊ฐ€ dp๋กœ ํ’€๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”์ง€..? ์ •ํ™•ํžˆ ์ •์˜ ๋‚ด๋ฆฌ๊ธฐ ์–ด๋ ค์› ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— dp ๋ฌธ์ œ ๊ตฌ๋ถ„๋ฒ•์„ ์ •์˜ํ•ด๋ด„

 

1. ์ˆ˜ ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋Š”๊ฐ€? -> ์Šคํ‹ฐ์ปค๋ฅผ ๋œฏ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์Œ
2. ๊ฒฝ์šฐ์˜ ์ˆ˜์ค‘์— ๋ญ”๊ฐ€ ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ๊ณ„์† ํ•˜๋Š”๊ฐ€? -> ์Šคํ‹ฐ์ปค ๋ฌธ์ œ์˜ ์˜ˆ์‹œ์—์„œ 14+11๊ฐ™์ด ๊ณ„์† ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ํ•œ๋‹ค

 

์œ„์˜ 2๊ฐ€์ง€๋ฅผ ๋งŒ์กฑํ•˜๋ฉด dp๋ฌธ์ œ๋ผ๊ณ  ํŒ๋‹จ์„ ๋‚ด๋ ธ๋‹ค. (์ž์„ธํ•œ ์„ค๋ช…์€ ๋งํฌ ์ฐธ๊ณ )

 

 

 

 

ํ’€์ด

์ด ๋ฌธ์ œ๋Š” dp๋ฅผ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ–ˆ๋‹ค. (์ด๋ถ€๋ถ„์€ ์ƒ๊ฐํ•ด๋‚ด์ง€ ๋ชปํ•ด ํžŒํŠธ๋ฅผ ๋ณด์•˜๋‹ค.)

 

1. ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€ ๊ฒฝ์šฐ -> ๋‘๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ, dp[0] = sticker[0], dp[1] = sticker[0]

2. ์ฒซ๋ฒˆ์งธ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์ง€ ์•Š์€ ๊ฒฝ์šฐ  -> dp[0] = 0, dp[1] = sticker[1]

 

์œ„์™€ ๊ฐ™์ด ๋‘๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ dp1, dp2๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ’€์—ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์•ผ ํ• ์ง€ ๋ง์•„์•ผํ• ์ง€ ๋ฐ”๋กœ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. 
1. dp[i-2]+sticker[i] -> ํ˜„์žฌ ์Šคํ‹ฐ์ปค๋ฅผ ๋—€๋‹ค.
2. dp[i-1]  -> ํ˜„์žฌ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์ง€ ์•Š๋Š”๋‹ค.
๋‘˜ ์ค‘ ๋ฌด์—‡์ด ๋” ํฐ์ง€ ํŒ๋‹จํ•˜๋Š”

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

dp[i]๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

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

 

dp ์–ด๋ ต๋‹ค..

profile

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป iOSun

@iosun

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!

profile on loading

Loading...