๐๋ฌธ์
โ๊ตฌ์
N์๋ฆฌ์์ ์ซ์์์ 0, 1, 2 ๋ง ๊ฐ์ง๊ณ ๋ง๋ค ์ ์๋ 3์ ๋ฐฐ์์ ๊ฐฏ์๋ฅผ ์ถ๋ ฅํด์ผ ํ๋๋ฐ ์ผ์ ํจํด์ด ์๋์ง ํ์ ์ ํ๋ฉด ๋์ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํ ์ ์์ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค. ์ฐ์ , ์ ๋ ฅ๊ฐ N ์ ๋ฐ๋ฅธ ์ถ๋ ฅ ๊ฐฏ์๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ฐฑํธ๋ํน์ผ๋ก ์ถ๋ ฅ๊ฐ์ ํ์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
ํจํดํ์ ์ ์ํ ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ ์ฝ๋.
const result = [];
const N = 10;
const backTracking = (arr, line) => {
if (line.length !== N) {
const len = arr.length;
for (let i = 0; i < len; i++) {
const copyArr = [...arr];
const copyLine = [...line];
const num = copyArr[i];
copyLine.push(num);
backTracking(copyArr, copyLine);
}
} else {
if (line[0] !== 0) {
const num = +line.join("");
!(num % 3) && result.push(num);
}
line = [];
}
};
backTracking([0, 1, 2], []);
console.log(result.filter((e) => !(e % 3)).length % 1000000009);
์ถ๋ ฅ
์์ ์ฝ๋๋ก N์ด 2, 4, 5, 6, 7, 8, 9 ์ผ๋์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํจ์ผ๋ก 1์์ 10 ๊น์ง N์ ๋ฐ๋ฅธ ์ถ๋ ฅ๊ฐ์ ํ์
ํ ์ ์์๋ค.
1 -> 0
2 -> 2
3 -> 6
4 -> 18
5 -> 54
6 -> 162
7 -> 486
8 -> 1458
9 -> 4374
10 -> 13122
+ ) ๋ฐฑํธ๋ํน์ผ๋ก๋ ์ด ๋ฌธ์ ๊ฐ ์๊ตฌํ๋ ์ถ๋ ฅ๊ฐ์ ์ถฉ์กฑ์ํฌ ์ ์์ด ์ถ๊ฐ๋ก ์ ์ถํด ๋ณด์๋ค.
๊ฒฐ๊ณผ๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ
์ด์ ๋ ๋์ ๊ณํ๋ฒ์ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ์ ์ฅํด์ผํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ํด ๊ฒฐ์ ๋๋๋ฐ ๋ฐฑํธ๋ํน์ ์ฌ๊ท ํธ์ถ์ ์ฌ์ฉ๋๋ ํธ์ถ ์คํ ํฌ๊ธฐ์ ์ ํ์ง๋ฅผ ์ ์ฅํ๋ ๋ฐ ํ์ํ ๊ณต๊ฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋์ ๊ณํ๋ฒ์ ๊ณต๊ฐ๋ณต์ก๋๊ฐ O(n) ์ด์ง๋ง ๋ฐฑํธ๋ํน์ O(d) (d : ํ์์ ์ต๋ ๊น์ด) ์ด๋ค.
๋ฐฑํธ๋ํน์ผ๋ก ์๋ํ ์ฝ๋๋ฅผ ๋ณด๋ฉด
if (line.length !== N)
line ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ N ์ ๋ง์กฑํ ๋ ๊น์ง ์ฌ๊ท ํธ์ถ์ ๋ฐ๋ณต ํ๋ค.
ํนํ๋ ์ด ๋ฌธ์ ๋ N ์ ๋ฒ์๊ฐ 1 ์ด์ 33,333 ์ดํ์ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋นํ ์์ค์ N ์ด ์ ๋ ฅ๋๋ค๋ฉด ๋ฐฑํธ๋ํน์ผ๋ก๋ ์ถฉ๋ถํ ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๊ฒ ์ผ๋, N ์ ๊ฐ์ด ์ปค์ง๋ ๊ฒฝ์ฐ ์ค๋ณต๊ณ์ฐ์ด ๋ง์์ง๊ฒ๋๊ณ ์ฑ๋ฅ ์ ํ ๋ฐ ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐฑํธ๋ํน์ผ๋ก ์์๋ธ ์ถ๋ ฅ๊ฐ์ผ๋ก ๋์ ๊ณํ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ์ณ๋ฐ๋ฅผ ๊ฒ์ด๋ค.
์ฝ๋.
const N = +require("fs").readFileSync("./input.txt", "utf-8").trim();
const dp = [0, 2];
const solution = (n) => {
for (let i = 2; i < n; i++) {
if (dp[i]) dp[i];
else dp[i] = (dp[i - 1] * 3) % 1000000009;
}
};
solution(N);
console.log(dp[N - 1]);
ํจํด์ ํ์ ํด๋ณด๋ f(i) ์ ๊ฐ์ f(i - 1) ์ ๊ฐ์ 3 ์ ๊ณฑํ ๊ฐ๊ณผ ๊ฐ์ ๊ฒ์ ์ ์ ์์๋ค.
dp ๋ฐฐ์ด์ ์ด๊น๊ฐ์ [0, 2] ๋ก ์ค์ ํด์ฃผ์๊ณ , ์ธ๋ฑ์ค๋ ํญ์ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ dp ๋ฐฐ์ด์ N - 1 ๋ฒ์งธ ๊ฐ์ ์ถ๋ ฅํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๊ฐ์ ์ฝ๋.
์์ฑํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ ์ค ๋ฌธ์ ์์๋
์ซ์๊ฐ ๋๋ฌด ์ปค์ง ์ ์๊ธฐ์ dp[N-1] ์ ๊ฐ์ 10^8 + 9(1,000,000,009) ๋ก ๋๋ ๊ฐ์ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค.
๋คํ์ด ์์ ์ฝ๋๋ก๋ ๋ฌธ์ ๋ ์์ด ์ถ๋ ฅ๋์๊ณ ์ฌํ์ธ ํด๋ณธ ๊ฒฐ๊ณผ N์ด 33,333์ธ ๊ฒฝ์ฐ์๋ ์ถ๋ ฅ๊ฐ์ ๋์ผํ์ง๋ง ๋ฌธ์ ์ ์กฐ๊ฑด์ ์ข๋ ์ ์ ํ๊ฒ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
const N = +require("fs").readFileSync("./input.txt", "utf-8").trim();
const dp = [0n, 2n];
const solution = (n) => {
for (let i = 2; i < n; i++) {
if (dp[i]) dp[i];
else dp[i] = dp[i - 1] * 3n;
// ๊ธฐ์กด ์ฝ๋ : else dp[i] = (dp[i - 1] * 3) % 1000000009;
}
};
solution(N);
console.log(`${dp[N - 1] % 1000000009n}`);
// ๊ธฐ์กด ์ฝ๋ : console.log(`${dp[N - 1]}`);
๐ฅ๋ฐฐ์ด ์
์ฐ๋ฌ์ ๋์ ๊ณํ๋ฒ ๊ด๋ จ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ณ ์๋๋ฐ, ์ด๋ฒ ๋ฌธ์ ๋ ๋์ ๊ณํ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ณ์ ๋ฐฉ์์ด์์ง๋ง ๋ฐฑํธ๋ํน์ ์ฌ์ฉํด์ ์ฑ๋ฅ์ ๋จ์ด์ง์ง๋ง ๋ค์ํ ์ ๊ทผ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ๋ฐ๋ผ๋ณผ ์ ์์๋๊ฒ ๊ฐ๋ค. ํนํ, ํ์์ ๋ฐฑํธ๋ํน์ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ DP๋ฅผ ์ฌ์ฉํด์๋ ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋ ๋ณธ์ ์๋๋ฐ ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด ๊ถ๊ธ์ ํ์ง๋ง, ํฌ๊ฒ ํ๊ณ ๋ค์ง ์์๋๋ฐ
๋ฐฑํธ๋ํน์ ๊ฒ์ ๋ฒ์๊ฐ ํฌ์ง ์๊ฑฐ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ํ์์ ๋น ๋ฅด๊ฒ ์ค์ผ ์ ์๊ฑฐ๋, ๋ฌธ์ ๋ฅผ ํ์ํ๋ฉฐ ํ์ด๊ฐ๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ด ๊ฒฝ์ฐ ์ ํฉํ๊ณ ,
๋์ ๊ณํ๋ฒ์ ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ฌธ์ ํฌ๊ธฐ๊ฐ ํฌ๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ ์คํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ ํฉํ๋ค. ์ด ์ ์ ์์ง๋ง๊ณ ๊ฐ๊ฐ์ ์ผ์ด์ค์ ๋ง๊ฒ ํจ์จ์ ์ธ ํด๊ฒฐ๋ฒ์ ์ ์ฉํ๋ ์ฐ์ต์ ํด์ผ๊ฒ ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 15992 1, 2, 3 ๋ํ๊ธฐ 7 (0) | 2025.02.20 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ฒ๋ธ์ ๋ ฌ(Bubble sort) (1) | 2025.01.09 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 1904 01ํ์ผ (1) | 2024.12.26 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 1003 ํผ๋ณด๋์น ํจ์ (1) | 2024.12.12 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑํธ๋ํน(Backtracking) (0) | 2024.11.07 |