ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

1, 2, 3 ๋”ํ•˜๊ธฐ ์‹œ๋ฆฌ์ฆˆ

 

๋ฌธ์ œ

 

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

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

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ๊ธฐ์กด์˜ ๋ฌธ์ œ์™€ ๋‹ฌ๋ฆฌ ์—ฐ์†๋œ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ ๋ฌธ์ œ์ด๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ DP๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 1, 2, 3 ๋”ํ•˜๊ธฐ์˜ ๊ฒฝ์šฐ ์ ํ™”์‹์„ `dp[n] = dp[n - 1] + dp[n - 2] + dp[n - 3]`์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋’ค์˜ ์ˆซ์ž๊ฐ€ ์—ฐ์†๋˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค.

 

 ๋”ฐ๋ผ์„œ DP๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ `dp[๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ˆ˜์˜ ํ•ฉ][๋งˆ์ง€๋ง‰ ๋’ท์ž๋ฆฌ์˜ ์ˆ˜]`์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜๊ณ  ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

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

 ์ฆ‰ DP[1]์˜ ๊ฒฝ์šฐ DP[1][1]์„ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€์˜ ๊ฒฝ์šฐ๋Š” 1์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋‹ค. DP[2]์˜ ๊ฒฝ์šฐ `1 + 1`์€ ์—ฐ์†๋˜๊ณ  2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ๋งŒ 2๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. DP[3]์˜ ๊ฒฝ์šฐ ๋’ท์ž๋ฆฌ๊ฐ€ 1, 2, 3์œผ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ `2 + 1`, `1 + 2`, `3`๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 ์ด์™€ ๊ฐ™์€ ๊ทœ์น™์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ์ ํ™”์‹์„ ์ด๋Œ์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • `dp[n][1] = dp[n - 1][2] + dp[n - 1][3]`
  • `dp[n][2] = dp[n - 2][1] + dp[n - 2][3]`
  • `dp[n][3] = dp[n - 3][1] + dp[n - 3][2]`

 

์ฝ”๋“œ

from sys import stdin


if __name__ == '__main__':
    MAX = 100001
    divisor = 1000000009
    dp = [[0] * 4 for _ in range(MAX)]

    dp[0] = [0] * 4
    dp[1] = [0, 1, 0, 0]
    dp[2] = [0, 0, 1, 0]
    dp[3] = [0] + [1] * 3

    for i in range(4, MAX):
        dp[i][1] = (dp[i - 1][2] + dp[i - 1][3]) % divisor
        dp[i][2] = (dp[i - 2][1] + dp[i - 2][3]) % divisor
        dp[i][3] = (dp[i - 3][1] + dp[i - 3][2]) % divisor

    t = int(stdin.readline())

    for _ in range(t):
        n = int(stdin.readline())
        print(sum(dp[n]) % divisor)

 ๊ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ• ๋•Œ๋งˆ๋‹ค `divisor`๋กœ ๋‚˜๋ˆ„์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€