๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr

์ ํ์ฌํญ
- ๊ฐ๋ก์ ๊ธธ์ด n์ 5,000์ดํ์ ์์ฐ์ ์ ๋๋ค.
- ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์ ์ง ์ ์์ผ๋ฏ๋ก, ๊ฒฝ์ฐ์ ์๋ฅผ 1,000,000,007์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ returnํด์ฃผ์ธ์.
์ ์ถ๋ ฅ ์์
| n | ๊ฒฐ๊ณผ |
| 4 | 11 |











๋ฌธ์ ํ์ด
์ด๋ฐ ๋ฌธ์ ์ ์ ๊ทผ์ n์ด 1์ผ๋๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๊ทผํด์ผํ๋ค.
ํ์ง๋ง ์ธ๋ก๊ฐ 3์ผ๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก n์ด ํ์์ผ ๋, ํ์ผ์ ๋ชจ๋ ์ฑ์ฐ๋ ๊ฒฝ์ฐ์ ์๋ 0์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ง์ ๋ด์ฉ๋ง ๊ณ ๋ คํ๋ฉด ๋๋ค.
๊ทธ๋ผ n=2 ์ผ ๋๋ 3๊ฐ๋ก ์ฃผ์ด์ง ์์์์ ์ฐพ์ ์ ์๋ค.



n=4์ผ ๋๋ 11๊ฐ๋ก ์ค๋ช ์ ๋์์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ ๊น๊ฒ ๋ด์ผํ ์ ์ n=4์ผ ๋, n=2์ผ ๋์ ๋น๊ตํด์ ๋ค๋ฅธ ์ ์ ๊ฐ๋ก๋ก ํ์ผ์ด 2๊ฐ์ฉ ๋ค์ด๊ฐ๋ ํํ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ ์ด๋ค.


n=6์ผ ๋๋ฅผ ์ธ์ด๋ณด์.

๊ฐ๋ก๋ฅผ 2/2/2๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์(3*3*3)
(1, 2, 4, 5, 9, 10, 12, 13, 14, 15, 17, 18, 21, 22, 23, 24, 25, 26, 31, 32, 34, 35, 36, 37, 39, 40, 41)
+ ๊ฐ๋ก๋ฅผ 4/2๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์(2*3*2)
(3, 7, 8, 11, 16, 19, 20, 28, 29, 30, 33, 38)
+ ๊ฐ๋ก๋ฅผ 6๊ฐ ํต์ฑ๋ก ์ฑ์ฐ๋ ๋ฐฉ์(2)
(6, 27)
์ด 41๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค.
n=8์ผ ๋๋
๊ฐ๋ก๋ฅผ 2/2/2/2๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์(3*3*3*3)
+ ๊ฐ๋ก๋ฅผ 2/2/4๋ก ํํ๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์(2* 3*3*3)
+ ๊ฐ๋ก๋ฅผ 4/4๋ก ํํ๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์(2*2)
+ ๊ฐ๋ก๋ฅผ 2/6๋ก ํํ๋ก ๋๋์ด ์ฑ์ฐ๋ ๋ฐฉ์ (3* 2* 2)
+ ๊ฐ๋ก๋ฅผ 8๊ฐ ํต์ฑ๋ก ์ฑ์ฐ๋ ๋ฐฉ์ (2)


๋ก ์ด 153๊ฐ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
์ด๋ก์จ 2์ผ๋, 4์ผ๋, 6์ผ๋, 8์ผ๋๋ฅผ ๋ณด๋ฉด ๊ฐ๊ฐ 3, 11, 41, 153์ผ๋ก ์ฌ๊ธฐ์ ์ ํ์์ ์ฐพ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ์ฌ ๊ตฌํํด์ผํ๋ค.
๊ฐ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋ณด๋ฉด (n=6) = 4 * (n=4) - (n=2)๋ผ๋ ๊ด๊ณ์์ ์ฐพ์ ์ ์๊ณ , ์ด๋ฅผ n=8 ์ ๋์ ํด๋ณด๋ฉด,
(n=8) = 4 * (n=6) - (n-4) = 4 * 41 - 11 = 153 ์ผ๋ก ์ฑ๋ฆฝํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด DP ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
( n>>1์ shift ์ฐ์ฐ์๋ก n/2์ ์์์ ์๋ฆฌ๋ฅผ ๋ฒ๋ฆฐ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ์ด ๋์จ๋ค.)
const dp = Array((n >> 1)+1).fill(0);
dp[0] = 1;
dp[1] = 3;
dp[2] = 11;
for (let i = 3; i <= (n>>1); i++) {
dp[i] = (4 * dp[i-1] - dp[i-2]);
}
์ฌ๊ธฐ์ ์กฐ์ฌํด์ผํ๋ ์ ์ ์ ํ์ฌํญ์ ์์ง ์๊ณ ์ ์ฉ ํ๋ ๊ฒ์ด๋ค.
์ ํ์ฌํญ
- ๊ฐ๋ก์ ๊ธธ์ด n์ 5,000์ดํ์ ์์ฐ์ ์ ๋๋ค.
- ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์ ์ง ์ ์์ผ๋ฏ๋ก, ๊ฒฝ์ฐ์ ์๋ฅผ 1,000,000,007์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ returnํด์ฃผ์ธ์.
์ ํ์ฌํญ ์ค, ๊ฒฝ์ฐ์ ์๋ฅผ 1,000,000,007์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๋ฐํํ๊ธฐ์ ๋ง์ง๋ง์๋ง ์ ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ์ง๋ง
์ซ์๊ฐ ์ปค์ง๋ ๊ฒฝ์ฐ, ์ฐ์ฐ ์์ฒด๋ก ์ธํด ์๊ฐ์ด๊ณผ๊ฐ ๋ ์ ์๊ธฐ์ DP ๋ฐฐ์ด์ ์ ์ฅํ ๋๋ถํฐ ๋๋์ด์ผํ๋ค.
๋จ, ์ค๊ฐ์ ๋๋จธ์ง ๊ฐ๋ณด๋ค n+1 ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๋์ฌ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ํด๋น ๊ฒฝ์ฐ๋ง ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค.
์ด ๋ด์ฉ์ ๋ฐ์ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Code
const DEVIDED = 1000000007;
function solution(n) {
if (n & 1) return 0;
const dp = Array((n >> 1)+1).fill(0);
dp[1] = 3;
dp[2] = 11;
for (let i = 3; i <= (n>>1); i++) {
dp[i] = (4 * dp[i-1] - dp[i-2]) % DEVIDED;
if (dp[i] < 0) dp[i] += DEVIDED;
}
return dp[n>>1];
}
๋ํ์ ์ธ DP ๋ฌธ์ ์ด์ง๋ง ๋๋จธ์ง ๊ฐ์ผ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค๋ ๊ฒ์ ์๊ฐํ์ง ๋ชปํ๋ฉด ํ๋ฆด ์ ๋ฐ์ ์๋ ๋ฌธ์ ์ด๋ค.
๊ฐ๋จํ๊ฒ ๋๋ ์ค ์์๋๋ฐ ๋๋จธ์ง ์์ธ์ฒ๋ฆฌ์์ ์๊ฐ์ ๋ง์ด ์ก์๋จน์ด ์ด๋ฅผ ์๊ฐํ ์ ์๋๋ก ํ๋ ์ข์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค.
'๐ STUDY > ์๋ฃ๊ตฌ์กฐ & ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๋ฃ๊ตฌ์กฐ] ์คํ(Stack) (0) | 2026.01.16 |
|---|---|
| 10986. ๋๋จธ์ง ํฉ (0) | 2024.04.02 |
| [์๊ณ ๋ฆฌ์ฆ] ๋์ ํฉ(Prefix Sum) (0) | 2024.04.02 |
| 11286. ์ ๋๊ฐ ํ (0) | 2024.03.12 |
| ํฌ๋ฃจ์ค์นผ(Kruskal) - ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) (1) | 2024.01.10 |