[๋ฐฑ์ค€][Kotlin] - ์Šค์œ„์น˜(30460)

๋ฌธ์ œ ์†Œ๊ฐœ

๐Ÿฅ‡๏ธ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ5
๐Ÿ”” ๋ฌธ์ œ ์œ ํ˜• : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
๐Ÿ’ฌ ํ’€์ด ์–ธ์–ด : Kotlin
๐Ÿ–‡๏ธ ๋ฌธ์ œ ๋งํฌ : ๋ฐฑ์ค€ ๋ฌธ์ œ ๋งํฌ

๐Ÿ“ ๋ฌธ์ œ

โ€Ši์ดˆ์— A_i์˜ ์ ์ˆ˜๋ฅผ ์–ป๋Š” ๊ฒŒ์ž„์ด ์žˆ๋‹ค. N์ดˆ ๋™์•ˆ ์ง„ํ–‰ํ•˜๋Š” ์ด ๊ฒŒ์ž„์—์„œ๋Š” ์ ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์–ป๊ธฐ ์œ„ํ•ด T์ดˆ์— ์Šค์œ„์น˜๋ฅผ ๋ˆŒ๋Ÿฌ T,T+1,T+2์ดˆ์— ์–ป๋Š” ์ ์ˆ˜๋ฅผ 2๋ฐฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. T์ดˆ์— ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋ฉด T+3์ดˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ์ž„์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์Šค์œ„์น˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ˆŒ๋ €์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

๐Ÿค” ๋ฌธ์ œ ๋ถ„์„

DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ธฐ ๋•Œ๋ฌธ์—, ์ ํ™”์‹์„ ๋จผ์ € ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋“ฏ์ด, ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋Š” ์„ ํƒ์ง€์™€ ๋ˆ„๋ฅด์ง€ ์•Š๋Š” ์„ ํƒ์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด ๋•Œ, ๋งจ ์•ž์—์„œ๋ถ€ํ„ฐ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ, ์ด์ „์— ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๋’ค์—์„œ๋ถ€ํ„ฐ ์ ‘๊ทผ์„ ํ•ด๋ดค๋‹ค.

์ ํ™”์‹

์šฐ์„ , dp[i]๋Š” i์ดˆ๋ถ€ํ„ฐ ๊ฒŒ์ž„์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํ’€์ด ์ฝ”๋“œ๋Š” ๋’ค๋ถ€ํ„ฐ ์ ‘๊ทผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— dp[0]์ด ์ •๋‹ต์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

i์ดˆ์—์„œ ๊ฐ€๋Šฅํ•œ ์„ ํƒ์ง€๋Š” ๋‘ ๊ฐ€์ง€ ๋ฟ์ด๋‹ค.

์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

  • i์ดˆ์˜ ์ ์ˆ˜ scores[i]๋ฅผ ๊ทธ๋Œ€๋กœ ์–ป๋Š”๋‹ค.
  • ๋‹ค์Œ ์ƒํƒœ : dp[i + 1]

์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ

  • i, i + 1, i + 2์ดˆ ์ ์ˆ˜ 2๋ฐฐ ์ด๋ฒคํŠธ
  • ๋‹ค์Œ ์ƒํƒœ : dp[i + 3]

์ฆ‰, ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

dp[i] = max(
    dp[i + 1] + scores[i],
    dp[i + 3] + 2 * (scores[i] + scores[i + 1] + scores[i + 2])
)

์ด์ œ, ์ด๋ฅผ n - 1์—์„œ 0๊นŒ์ง€ ์—ญ์ˆœ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ์ •๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

for (i in n - 1 downTo 0) {  
    dp[i] = max(
        dp[i + 1] + scores[i],
        dp[i + 3] + 2 * (scores[i] + scores[i + 1] + scores[i + 2])
    )  
}

์‹œ๋ฎฌ๋ ˆ์ด์…˜

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋Œ๋ ค๋ณด์ž.

5
-1 -2 -3 4 5
dp = [0, 0, 0, 0, 0, 0, 0, 0]
scores = [-1, -2, -3, 4, 5, 0, 0, 0]
  • i = 4
    • dp[5] + scores[4]
      • = 0 + 5 → 5
    • dp[7] + (scores[4] + scores[5] + scores[6]) * 2)
      • = 0 + 2 * (5 + 0 + 0) → 10
    • dp = [0, 0, 0, 0, 10, 0, 0, 0]
  • i = 3
    • dp[4] + scores[3]
      • = 10 + 4 → 14
    • dp[6] + (scores[3] + scores[4] + scores[5]) * 2)
      • = 0 + 2 * (4 + 5 + 0) → 18
    • dp = [0, 0, 0, 18, 10, 0, 0, 0]
  • i = 2
    • dp[3] + scores[2]
      • = 18 + -3 → 15
    • dp[5] + (scores[2] + scores[3] + scores[4]) * 2)
      • = 0 + 2 * (-3 + 4 + 5) → 12
    • dp = [0, 0, 15, 18, 10, 0, 0, 0]
  • i = 1
    • dp[2] + scores[1]
      • = 15 + -2 → 13
    • dp[4] + (scores[1] + scores[2] + scores[3]) * 2)
      • = 10 + 2 * (-2 + -3 + 4) → 8
    • dp = [0, 13, 15, 18, 10, 0, 0, 0]
  • i = 0
    • dp[1] + scores[0]
      • = 13 + -1 → 12
    • dp[3] + (scores[0] + scores[1] + scores[2]) * 2)
      • = 18 + 2 * (-1 + -2 + -3) → 6
    • dp = [12, 13, 15, 18, 10, 0, 0, 0]

์ •๋‹ต : 12

๐Ÿ˜Ž ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 36152 KB
์‹œ๊ฐ„ : 300 ms
import java.util.StringTokenizer  
import kotlin.math.max  

fun main() = with(System.`in`.bufferedReader()) {  
    val n = readLine().toInt()  

    val st = StringTokenizer(readLine())  
    val scores = IntArray(n + 3) { 0 }  
    repeat(n) {  
        datum[it] = st.nextToken().toInt()  
    }  

    val dp = Array(n + 3) { 0 }  

    for (i in n - 1 downTo 0) {  
        dp[i] = max(
            (dp[i + 1] + scores[i]), 
            (dp[i + 3] + (scores[i] + scores[i + 1] + scores[i + 2]) * 2)
        )  
    }  

    println(dp[0])  
}

'PS > DP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€][JAVA] - 1, 2, 3 ๋”ํ•˜๊ธฐ(9095)  (2) 2023.10.26