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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 10844๋ฒˆ - ์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜ (dp ๊ธฐ์ดˆ ๋ฌธ์ œ, 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋™์ ๊ณ„ํš๋ฒ• ๋ฌธ์ œ ํ’€๊ธฐ)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 12. 15:04
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ๋งํฌ

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

 

10844๋ฒˆ: ์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜

์ฒซ์งธ ์ค„์— ์ •๋‹ต์„ 1,000,000,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

 

ํ’€์ด IDEA

dp๋ฅผ ๊พธ์ค€ํžˆ ํ’€๋‹ค๋ณด๋‹ˆ, ์–ด๋–ค๊ฒŒ 2์ฐจ์›์œผ๋กœ ํ’€์–ด์•ผํ• ์ง€, ์–ด๋–ค๊ฒŒ ์ผ๋ฐ˜ dp 1์ฐจ์› ๋ฐฐ์—ด๋กœ ํ’€์–ด์•ผํ• ์ง€ ๊ฐ์ด ์žกํ˜”๋‹ค. ์˜ฌ๋ ˆ! ํ•ด๋‹น ๋ฌธ์ œ๋Š” N=1 ๋ถ€ํ„ฐ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ฐ์ ธ๊ฐ€๋ฉฐ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด๋‹ˆ, ๊ทœ์น™์ด ๋ˆˆ์— ๋ณด์˜€๋‹ค.

์ฐพ์€ ๊ทœ์น™์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ๋งจ ๋’ท์ž๋ฆฌ์ˆ˜๊ฐ€ 0๊ณผ 9์ธ ๊ฒฝ์šฐ์—๋Š” ํ•œ๊ฐ€์ง€์”ฉ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๊ณ , 1~8 ์ด๋ผ๋ฉด ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ทœ์น™์„ ์ฐพ์•„๋‚ผ ์ˆ˜์žˆ๋‹ค. ์ด๋ฅผ dp ๊ฒฝ์šฐ์˜์ˆ˜์— ๋งž๊ฒŒ ๋„์‹ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ํ˜„์žฌ N์—์„œ, 0์„ ๋งจ ๋’ท์ž๋ฆฌ๋กœ ๊ฐ€์ง€๋ ค๋ฉด, N-1์˜ ๋์ž๋ฆฌ 1์ธ ๊ฒฝ์šฐ๋“ค์ด ์™€์•ผํ•œ๋‹ค.
    • dp[N][0] = dp[N-1][1]
  • ํ˜„์žฌ N์—์„œ, 9๋ฅผ ๋งจ ๋์ž๋ฆฌ๋กœ ๊ฐ€์ง€๋ ค๋ฉด, N-1์˜ ๋์ž๋ฆฌ 8์ธ ๊ฒฝ์šฐ์ด๋‹ค.
    • dp[N][9] = dp[N-1][8]
  • ํ˜„์žฌ N์—์„œ, 1,2,3,4,5,6,7,8 ์„ ๋งจ ๋์ž๋ฆฌ๋กœ ๊ฐ€์ง€๋ ค๋ฉด N-1์—์„œ ์•ž๋’ค ์ˆซ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค. (์ด 2๊ฐœ)
    • dp[N][j] = dp[N-1][j-1] + dp[N-1][j+1]

์œ„ ์„ธ๊ฐœ์˜ ์ ํ™”์‹์„, ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ตฌํ˜„ํ•œ ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ ์ฃผ์–ด์ง„๋Œ€๋กœ 1000000000์„ ๋‚˜๋ˆ„์–ด์„œ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ๋‹ค.

let n = Int(readLine()!)!
var dp = [[Int]](repeating: Array(repeating: 0, count: 10), count: n+1)
var sum = 0

for i in 0...9 {
    dp[1][i] = 1
}

if n > 1 {
    for i in 2...n {
        for j in 0...9 {
            if j == 0 {
                dp[i][0] = dp[i-1][1] % 1000000000
            } else if j == 9 {
                dp[i][9] = dp[i-1][8] % 1000000000
            } else {
                dp[i][j] = (dp[i-1][j-1] + dp [i-1][j+1]) % 1000000000
            }
        }
    }
}

for i in 1...9 {
    sum = (sum + dp[n][i]) % 1000000000
}


print(sum%1000000000)

 

๋ฐ˜์‘ํ˜•