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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 2225๋ฒˆ - ํ•ฉ๋ถ„ํ•ด (dp, 2์ฐจ์› ๊ทœ์น™, ์Šค์œ„ํ”„ํŠธ ํ’€์ด)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 18. 20:37
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ๋งํฌ

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

 

2225๋ฒˆ: ํ•ฉ๋ถ„ํ•ด

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

www.acmicpc.net

 

ํ’€์ด IDEA

๊ทœ์น™์„ ์ฐพ๋‹ค๊ฐ€ 2์ฐจ์›๋ฐฐ์—ด๋กœ ํ’€์–ด์•ผํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ฏธ์ฒ˜ ํ•˜์ง€ ๋ชปํ•ด์„œ ์ธํ„ฐ๋„ท์„ ์ฐธ๊ณ ํ–ˆ๋‹ค. dp ๋„ ๋‹ค์–‘ํ•œ ์œ ํ˜•์„ ํ’€๋ฉฐ ์–ด๋–ค ์ƒํ™ฉ์ผ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ•˜๋Š”์ง€ ๊ฐ์„ ์ตํ˜€์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • ๊ทœ์น™์ฐพ๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ๋‹ค.
  • ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด 2์ฐจ์›์œผ๋กœ ํ’€์ž.
  • k๊ฐœ๋ฅผ ๋”ํ•ด์„œ n์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.
  • 2์ฐจ์› ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ํ‘œ๋ฅผ ๊ทธ๋ฆฌ๋ฉด์„œ ๊ทœ์น™์„ ์ฐพ์•„๋‚˜์„œ๋ฉด ๋œ๋‹ค.
  • ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ๊ทœ์น™์ด ์žˆ๋‹ค.
  • dp๋Š” ๋ฌด์กฐ๊ฑด ๊ทœ์น™๋ถ€ํ„ฐ!

๊ทœ์น™์„ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค. ์šฐ์„  ์œ„์—์„œ ์ ์€๊ฒƒ ์ฒ˜๋Ÿผ k๊ฐœ์˜ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ n์„ ๋งŒ๋“ค์ž! ๋ผ๋Š” ๋งฅ๋ฝ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๊ณ  ์ด๋ฅผ dp[k][n] ๋ฐฐ์—ด์— ๋„ฃ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ œ 2๋ฒˆ ์œผ๋กœ ์ฃผ์–ด์ง„ ์˜ˆ์‹œ๊ฐ€ ๊ทœ์น™์„ ์ฐพ๊ธฐ์— ์ ์ ˆํ•œ ๊ฒƒ ๊ฐ™์•„์„œ, n=6, k=4 ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทœ์น™์„ ์ฐพ์•„๋ณด์•˜๋‹ค.

๊ทœ์น™์„ ๋”ฐ๋ผ ํ‘œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด, ์šฐ์„  1์ฐจ์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค. ์ˆซ์ž 1๊ฐœ๋ฅผ ๊ฐ–๊ณ  1,2,3,4,5,6 ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ฐ๊ฐ 1๊ฐœ์ด๋ฉฐ, ์ˆซ์ž 0์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์˜์ˆ˜๋„ ๋ชจ๋‘ 1๊ฐœ์”ฉ์ด๋‹ค. (0+0+0=0 ์ด๋‹ˆ๊นŒ!) ์ด๋ฅผ ๋ชจ๋‘ ์ ์–ด ๋‘” ๋’ค, ์ƒ๋Œ€์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ์‰ฌ์šด 2 ๋ฅผ ๋จผ์ € ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ์ ์–ด๋ณด์ž.

ํ‘œ๋ฅผ ์ฑ„์›Œ ๋‚˜๊ฐ€๋‹ค ๋ณด๋‹ˆ, ์œ„์™€ ๊ฐ™์€ ๊ทœ์น™์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์ƒ๋Œ€์ ์œผ๋กœ ๊ทœ์น™์„ ์ฐพ๊ธฐ ๋…ธ๋ž€์ƒ‰ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”ฐ์ ธ๋ณด๋‹ˆ, [k-1][n] + [n][k-1] ๋ฒˆ์งธ์— ์žˆ๋Š” ์ˆ˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋…ธ๋ž€์ƒ‰ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ณ„์‚ฐ์‚ฐํ•˜๋‹ค๋ณด๋ฉด, ์ตœ์ข…์ ์ธ ๊ฐ’ ์ˆซ์ž 4๊ฐœ๋ฅผ ๋”ํ•ด์„œ 6์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜์ˆ˜๋Š” 84๋กœ, ์˜ˆ์ œ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ทœ์น™์„ ์ฐพ์•˜์œผ๋‹ˆ ์ด์ œ ์ ํ™”์‹์„ ๊ตฌํ•ด๋ณด์ž. ์ฒ˜์Œ ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ๋ณต์žกํ–ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ๊ทœ์น™์„ ์ฐพ์•„๋†“์œผ๋‹ˆ ๋น„๊ต์  ์ด๋ฒˆ ๋ฌธ์ œ์˜ ์ ํ™”์‹์€ ์‰ฝ๋‹ค. ์›ํ•˜๋Š” ๊ฐ’์˜ ์œ„+์˜† ๊ฐ’์„ ๋”ํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ ๋ง์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ•œ ์ ํ™”์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

dp[k๊ฐœ์˜์ˆ˜๋กœ][n๋งŒ๋“ค๊ธฐ] = dp[k-1][n] + dp[k][n-1]

์ด๋ ‡๊ฒŒ ๋งŒ๋“  ์ ํ™”์‹์„ ์†Œ์Šค์ฝ”๋“œ๋กœ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

์•„ ๊ทธ๋ฆฌ๊ณ , for ๋ฌธ์—์„œ k๋Š” 1๋ถ€ํ„ฐ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋–„๋ฌธ์— 1๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ด์ฃผ์—ˆ๋‹ค. (์ˆซ์ž๋ฅผ 0๊ฐœ ๋”ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ง์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ!) ๋”๋ถˆ์–ด์„œ, n=0์ผ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„์˜ ๊ณ„์‚ฐ์—†์ด ๋ชจ๋“  ๊ฒฝ์šฐ์œ ์ˆ˜๊ฐ€ 1์ด๋ฏ€๋กœ, if ๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ 1์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

let nk = readLine()!.split(separator: " ").map { Int(String($0))! }
var dp = Array(repeating: Array(repeating: 0, count: nk[0]+1), count: nk[1]+1)
// dp[k][n] k๊ฐœ ๋”ํ•ด์„œ ๊ฐ’์ด n

for k in 1..<nk[1]+1 {
    for n in 0..<nk[0]+1 {
        if n == 0 {
            dp[k][0] = 1
        } else {
            dp[k][n] = (dp[k-1][n]+dp[k][n-1]) % 1000000000
        }
    }
}

print(dp[nk[1]][nk[0]])
๋ฐ˜์‘ํ˜•