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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 15990๋ฒˆ - 1,2,3 ๋”ํ•˜๊ธฐ 5 (DP ๊ธฐ์ดˆ ๋ฌธ์ œ, 2์ฐจ์› ๋ฐฐ์—ด ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ๊ณ„ํš๋ฒ• ๋ฌธ์ œ ํ’€๊ธฐ)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 10. 16:54
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ ๋งํฌ

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

 

15990๋ฒˆ: 1, 2, 3 ๋”ํ•˜๊ธฐ 5

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค, n์„ 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ 1,000,000,009๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

 

ํ’€์ด IDEA

(DP ์–ด๋ ต๋‹ค .. ๋‚˜์ค‘์— ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ์—ฐ์Šตํ• ๋•Œ dp ๋ถ€๋ถ„์„ ์ง‘์ค‘์ ์œผ๋กœ ๊ณต๋žตํ•  ๊ฒƒ์ด๋‹ค ใ… ใ…  )

๋จผ์ € ํ’€์—ˆ๋˜ "๋ฐฑ์ค€ 9095๋ฒˆ 1,2,3 ๋”ํ•˜๊ธฐ" ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ, ๋”ํ•ด์ง€๋Š” ์ˆซ์ž์˜ "์ˆœ์„œ!!"๋ฅผ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ด ์–ด๋ ค์› ๋‹ค. 

9095๋ฒˆ  4๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ 1+1+1+1
1+1+2
1+2+1
2+1+1
2+2
1+3
3+1

๊ฐ™์€ ์ˆ˜ ์ค‘๋ณต ๊ฐ€๋Šฅ
15990๋ฒˆ (์ง€๊ธˆ ๋ฌธ์ œ) 4๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜  1+2+1
1+3
3+1

๊ฐ™์€ ์ˆ˜ ์—ฐ์† ๊ธˆ์ง€!

9095๋ฒˆ์˜ ์ ํ™”์‹์„ ๋ณด๋ฉด dp[n] = dp[n-1] + dp[n-2] + dp[n-3] ๋กœ, ๊ทธ์ € ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ •ํ•œ ๊ทœ์น™์„ ์ฐพ์•„์„œ ๋ฌธ์ œ์˜ ๋‹ต์„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.  ํ•˜์ง€๋งŒ ์ง€๊ธˆ ํ’€ ๋ฌธ์ œ์ธ 15990์„ ๋ณด๋ฉด, ๊ฐ™์€ ์ˆ˜๊ฐ€ ์—ฐ์†ํ•ด์„œ ๋“ฑ์žฅํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ์กฐ๊ฑด์ด ๋ถ™์–ด์žˆ๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์„๊นŒ?

์šฐ์„ , ์•ž์—์„œ dp ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ, dp ๋ฐฐ์—ด์—๋Š” '๊ฒฝ์šฐ์˜ ์ˆ˜'๋ฅผ value ๋กœ ๋„ฃ๋Š”๊ฒƒ์œผ๋กœ ์•ฝ์†ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ฐ”๋กœ ์ด์ „์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ์šฐ์˜์ˆ˜๊ฐ€ ๋Š˜๊ฒ ๋Š”๊ฐ€?๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋งจ ๋’ค์˜ ์ˆซ์ž๊ฐ€ [1] ์ธ ๊ฒฝ์šฐ, [2] ๋‚˜ [3] ์„ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งจ ๋’ค์˜ ์ˆซ์ž๊ฐ€ [2] ์ธ ๊ฒฝ์šฐ, [1] ์ด๋‚˜ [3] ์„ ๋”ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋งจ ๋’ค์˜ ์ˆซ์ž๊ฐ€ [3] ์ธ ๊ฒฝ์šฐ, [1] ์ด๋‚˜ [2] ๋ฅผ ๋”ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. 

์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์„ธ๊ฐ€์ง€๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•  ๊ฑฐ๋‹ค. dp[i][1], dp[i][2], dp[i][3] ์œผ๋กœ ํ•ด์„œ 1๋กœ๋๋‚˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฅผ dp[i][1] ์—, 2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ dp[i][2] ์— ๋ง์ด๋‹ค.

๊ทธ๋Ÿผ ๋” ์‰ฌ์šด ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ ์ˆซ์ž 6์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ์„ , ์šฐ๋ฆฌ๋Š” 1,2,3์„ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐ์„ ํ•œ๋‹ค. ๋”ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์—์„œ 3์ด ์ตœ๊ณ  ์ˆซ์ž์ด๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” 3์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ถ€ํ„ฐ ๋”ฐ์ง€๋ฉด ๋œ๋‹ค.

5๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ 
(1์„ ๋”ํ•ด์ฃผ์–ด์•ผ 6์ด ๋œ๋‹ค!)
2+1+2
1+3+1
2+3
3+2

(4๊ฐ€์ง€)
1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
1+3+1+1
1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒ๋ฉด +1์„ ํ•ด์ฃผ๋ฉด ์—ฐ์†์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
2+1+2+1
3+2+1

3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
2+3 +1
์—ฌ๊ธฐ์„œ dp[5]์—์„œ ๊ฐ€์ ธ์˜จ 4๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š”,
๋ชจ๋‘ dp[6] ์—์„œ [1]๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋˜๊ณ ,
dp[6][1] = 3์ด ๋œ๋‹ค!
4๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
(2๋ฅผ ๋”ํ•ด์ฃผ์–ด์•ผ 6์ด ๋œ๋‹ค)
1+2+1
1+3
3+1

(3๊ฐ€์ง€)
1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
1+2+1+2
3+1 +2

2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
x
2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒ๋ฉด +2 ๋ฅผ ํ•ด์ฃผ๋ฉด, ์—ฐ์†์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งˆ์นจ ํ•ด๋‹น ๊ฒฝ์šฐ์—๋Š” 2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๊ธดํ•˜๋‹ค.

3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
1+3 + 2
์—ฌ๊ธฐ dp[4] ๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋Š”,
๋ชจ๋‘ dp[6]์—์„œ๋Š” [2]๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋œ๋‹ค.
์ฆ‰, dp[6][2]=3 ์ด ๋œ๋‹ค!
3์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
(3์„ ๋”ํ•ด์ฃผ์–ด์•ผ 6์ด ๋œ๋‹ค)
1+2
2+1
3
1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
2+1+3

2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
1+2+3

3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ
+3
3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒ๋ฉด +3์„ ํ•ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, dp[6][3] = 2 ๊ฐ€ ๋œ๋‹ค.

์œ„๋ฅผ ๋„์‹ํ™” ํ•ด๋ณด์ž.

  • dp[6-1][1] = dp[6-1][2] + dp[6-1][3]     (1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ = 2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ + 3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ)
  • dp[6-2][2] = dp[6-2][1] + dp[6-2][3]   (2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ = 1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ + 3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ)
  • dp[6-3][3] = dp[6-3][1] + dp[6-3][2]   (3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ = 1๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ + 2๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ)

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

 

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

https://github.com/deslog/Algorithm/blob/main/Algorithm/Boj/15990_1%2C2%2C3%20%EB%8D%94%ED%95%98%EA%B8%B0%205/main.swift

 

GitHub - deslog/Algorithm

Contribute to deslog/Algorithm development by creating an account on GitHub.

github.com

 

๋ฐฐ์—ด์€ 0๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์ž‡๊ฒŒ ๋ชจ๋‘ +1 ํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค. 

let n = Int(readLine()!)!
var dp = [[Int]](repeating: Array(repeating: 0, count: 4), count: 100001)

dp[1] = [0, 1, 0, 0]
dp[2] = [0, 0, 1, 0]
dp[3] = [0, 1, 1, 1]

for j in 4..<100001 {
    dp[j][1] = dp[j-1][2]%1000000009 + dp[j-1][3]%1000000009
    dp[j][2] = dp[j-2][1]%1000000009 + dp[j-2][3]%1000000009
    dp[j][3] = dp[j-3][1]%1000000009 + dp[j-3][2]%1000000009
}


for _ in 1..<n+1 {
    let i = Int(readLine()!)!
    print((dp[i][1]+dp[i][2]+dp[i][3])%1000000009)
}

 

์—ฌ๊ธฐ์„œ ์ž ๊น, ์™œ print ํ•˜๊ธฐ ์ด์ „์— 100001 ๊ฐœ์˜ ๋ฐฐ์—ด ๋ชจ๋‘ ์ƒ์„ฑํ•ด ๋‘๊ณ  ์‹œ์ž‘ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” for๋ฌธ์„ ์ด์šฉํ•ด์„œ ์ž…๋ ฅ๋˜๋Š” ์ˆซ์ž๋งŒํผ๋งŒ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”๊ฒŒ, dp[50]๋ฅผ ๊ตฌํ•˜๊ณ , dp[100]์„ ๊ตฌํ• ๋•Œ, ๋˜ ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ๋Ÿ‰์ด +N ์”ฉ ๋” ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋ฐ˜์— 100001 ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ƒ์„ฑํ•ด ๋‘” ์ƒํƒœ์—์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๋นจ๋ž๋˜๊ฒƒ์ด๋‹ค.

๋ฐ˜์‘ํ˜•