15989๋ฒ: 1, 2, 3 ๋ํ๊ธฐ 4
์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 4๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ํฉ์ ์ด๋ฃจ๊ณ ์๋ ์์ ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒ์ผ๋ก ์น๋ค. 1+1+1+1 2+1+1 (1+1+2, 1+2+1) 2+2
www.acmicpc.net
๋ฌธ์
์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 4๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ํฉ์ ์ด๋ฃจ๊ณ ์๋ ์์ ์์๋ง ๋ค๋ฅธ ๊ฒ์ ๊ฐ์ ๊ฒ์ผ๋ก ์น๋ค.
- 1+1+1+1
- 2+1+1 (1+1+2, 1+2+1)
- 2+2
- 1+3 (3+1)
์ ์ n์ด ์ฃผ์ด์ก์ ๋, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ n์ด ์ฃผ์ด์ง๋ค. n์ ์์์ด๋ฉฐ 10,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.

๋ฌธ์ ํ์ด
import sys
t=int(sys.stdin.readline())
for _ in range(t):
n=int(sys.stdin.readline())
if n>3:
dp = [[0] * (4) for _ in range(n + 1)]
dp[1][1] = 1
dp[2][1] = 1
dp[2][2] = 1
dp[3][1] = 1
dp[3][2] = 1
dp[3][3] = 1
for i in range(4, n+1):
dp[i][1]=dp[i-1][1]
dp[i][2]=dp[i-2][1]+dp[i-2][2]
dp[i][3]=dp[i-3][1]+dp[i-3][2]+dp[i-3][3]
print(dp[n][1]+dp[n][2]+dp[n][3])
else:
if n==1:
print(1)
elif n==2:
print(2)
elif n==3:
print(3)
- 2์ฐจ์ ๋ฐฐ์ด์ DP๋ฅผ ์ด์ฉํ๋ ๋ฌธ์ ๋ค.
- 1,2,3์ ์ด์ฉํด์ ๋ง๋ค์ด์ผ ํ๋ ์ n์ ๋ํ dp ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค.
- dp[n][1] : n์ ๋ง๋ค ์ ์๋ '1' ๋ง์ผ๋ก ๋ง๋ค์ด์ง ์กฐํฉ
- dp[n][2] : n์ ๋ง๋ค ์ ์๋ 2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ค(1,2)๋ก ๋ง๋ค์ด์ง ์กฐํฉ์ด๋ฉด์ '2'๋ก ๋๋๋ ์กฐํฉ
- dp[n][3] : n์ ๋ง๋ค ์ ์๋ 3๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ค(1,2,3)์ผ๋ก ๋ง๋ค์ด์ง ์กฐํฉ์ด๋ฉด์ '3'์ผ๋ก ๋๋๋ ์กฐํฉ
- ๊ทธ ์ด์ ๋ '1+1+2','1+2+1', '2+1+1'์ฒ๋ผ ๊ฐ์ ์๋ค๋ก ์ด๋ฃจ์ด์ง ์กฐํฉ์ ์ค๋ณตํด์ ์นด์ดํ ํ์ง ์๊ธฐ ์ํด์์ด๋ค.
- ์๋ฅผ ๋ค์ด, n์ด 4์ผ ๋, dp[4][2]๋ 2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ค๋ก ๋ง๋ค์ด์ง ์กฐํฉ์ด๋ฉด์ '2'๋ก ๋๋์ผ ํ๊ธฐ ๋๋ฌธ์ '1+1+2'๋ง ์ธ์ด์ค๋ค.
- ์ด์ ์ ํ์์ ์ธ์์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
- dp[n][1]=dp[n-1][1]
- ์๋ฅผ ๋ค์ด, dp[3][1]์ '1+1+1'๋ก ํ๋ ๋ฟ์ธ๋ฐ, dp[4][1]๋ ์ฌ๊ธฐ์ 1์ ๋ํ '1+1+1+1' ํ๋ ๋ฟ์ด๋ค.
- dp[n][1]์๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์กฐํฉ ๋จ ํ๋๋ง ๊ฐ๋ฅํ๋ค.
- dp[n][2]=dp[n-2][1]+dp[n-2][2]
- ์๋ฅผ ๋ค์ด, dp[2][1]์ ๊ฒฝ์ฐ๋ '1+1', dp[2][2]์ ๊ฒฝ์ฐ๋ '2'๊ฐ ์ฌ ์ ์๋ค.
- ์ฌ๊ธฐ์ dp[4][2]='1+1+2', '2+2' ์ด๋ค.
- ๋ง์ง๋ง์ 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ค๋ฉด, n๋ณด๋ค 2๋งํผ ์์ ์์ 1 ๋๋ 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ +2๋ฅผ ํด์ฃผ๋ ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, n๋ณด๋ค 2๋งํผ ์์ ์์ 1 ๋๋ 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํฉ์น ๊ฒ๊ณผ ๊ฐ๋ค.
- dp[n][3]=dp[n-3][1]+dp[n-3][2]+dp[n-3][3]
- ์๋ฅผ ๋ค์ด, dp[4][1]='1+1+1+1', dp[4][2]='1+1+2' / '2+2', dp[4][3]='1+3' n=4์ผ ๋๋ ์ด 4๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด dp[7][3]์ '1+1+1+1+3', '1+1+2+3', '2+2+3', '1+3+3'๊ณผ ๊ฐ์ด ์ ๊ฒฝ์ฐ์ +3์ ํด์ฃผ๋ ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, n๋ณด๋ค 3๋งํผ ์์ ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๊ฐ๋ค.
- n์ด 4 ์ด์ ๋์ด์ผ ์ ์ ํ์์ ๋ง์กฑํ ์ ์๊ธฐ ๋๋ฌธ์ n์ด 0๋ถํฐ 3๊น์ง๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ง์ ์ธ์ dp ๊ฐ์ ์ด๊ธฐํํ๊ณ n์ด 4์ผ ๋๋ถํฐ ๋ชฉํํ๋ ์๊น์ง for๋ฌธ์ ๋๋ฉด์ dp ๋ฐฐ์ด์ ์ฑ์ฐ๋๋ก ๊ตฌํํ๋ค.
- ๋ง์ง๋ง์ ํด๋น ์์ ๋ชจ๋ dp ๋ฐฐ์ด์ ๋ชจ๋ ํฉํ ๊ฐ์ ์ถ๋ ฅํ๋ค.
'์๊ณ ๋ฆฌ์ฆ > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 2169 ๐ฅ] ๋ก๋ด ์กฐ์ข ํ๊ธฐ (0) | 2023.08.20 |
---|---|
[๋ฐฑ์ค 3687 ๐ฅ] ์ฑ๋ฅ๊ฐ๋น (0) | 2023.08.18 |
[๋ฐฑ์ค 1943 ๐ฅ] ๋์ ๋ถ๋ฐฐ (0) | 2023.08.16 |
[๋ฐฑ์ค 2631 ๐ฅ] ์ค์ธ์ฐ๊ธฐ (0) | 2023.08.12 |
[๋ฐฑ์ค 11053 ๐ฅ] ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (0) | 2023.08.12 |