๐๋ฌธ์
โ๊ตฌ์
ํผ๋ณด๋์น ํจ์๋ ๋ํ์ ์ธ ๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) ๊ณํ๋ฒ์ผ๋ก ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
์ฐ์ ๋ฌธ์ ๋ฅผ ๋ณด๋ N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ C++ ํจ์์ ์์ ๊ฐ ๋์์๋ค.
์ผ๋จ ๊ฐ๋จํ๊ฒ ์๊ฐํ๊ณ fibonacci(n) ์์ n์ด 0๊ณผ 1์ธ ๊ฒฝ์ฐ๋ฅผ ์นด์ดํ ํ๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ถ๋ ฅ์ ๋ณผ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ ๋๋ค.
ํ๋ฒ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
์๋ํ ์ฝ๋.
const [T, ...arr] = require("fs").readFileSync("/dev/stdin", "utf-8").trim().split("\n").map(Number);
const result = new Array(T);
let line = [0, 0];
const fibo = (n) => {
if (n === 0) {
line[0] += 1;
return 0;
}
if (n === 1) {
line[1] += 1;
return 1;
}
return fibo(n - 1) + fibo(n - 2);
};
arr.forEach((e, i) => {
fibo(e);
result[i] = line.join(" ");
line = [0, 0];
});
console.log(result.join("\n"));
์ฌ๊ท ํจ์
1. ๋ชจ๋ ๋ฐฐ์ด ์ํ
2. element ๋ฅผ fibo ํจ์์ ์ธ์๋ก ๋๊ฒจ์ค๋ค.
3. ์ฌ๊ทํจ์๋ฅผ ํตํด fibo ํจ์์ ์ธ์๋ก 0๊ณผ 1์ด ์ ๋ฌ ๋๋ ๊ฒ์ ์นด์ดํ ํ๋ค.
์ฒ์์๋ ๋ณ ์์ฌ ์์ด ๋ฌธ์ ์์ ์ ๊ณต๋ ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ ์๋ํด๋ณด์๋ค.
์ฐ์ ๋์์ ํด๋ณด๋ฉด ๊ธฐ๋ณธ ์์ ์ ๋ ฅ์ ๋ํ ์ถ๋ ฅ์ ๋ฌธ์ ์์ด ๋์ค๋ ๊ฒ์ ํ์ธํ๊ณ ์ด ๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ์ถํด๋ณด์๋ค.
๊ฒฐ๊ณผ๋.
์ถ๋ ฅ์๋ ์ ํ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ด ์ฝ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ถ์ํด๋ณด๋ฉด
1. fibo ํจ์์ ๋์
- fibo ํจ์๋ ์ฌ๊ท์ ์ผ๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํ๋ค.
- ์ฌ๊ท ํธ์ถ์ ์๋์ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋ค.
- fibo(n) ์ fibo(n-1) ๊ณผ fibo(n-2) ๋ฅผ ํธ์ถํ๋ค.
- ํธ์ถ ํธ๋ฆฌ๋ ์ด์ง ํธ๋ฆฌ์ฒ๋ผ ๋์ํ๋ฉฐ, ํธ๋ฆฌ์ ๊น์ด๋ n ์ด๋ค.
- ํธ๋ฆฌ์ ๋ ธ๋ ๊ฐ์๋ 2^n ์ ๋น๋กํ๋ฏ๋ก, ์ฌ๊ท ํธ์ถ์ ์๊ฐ ๋ณต์ก๋๋ O(2^n) ์ด๋ค.
2. ์ ์ฒด ์ฝ๋์ ๋์
- ์ ๋ ฅ T : ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์
- ์ ๋ ฅ ๋ฐฐ์ด arr : ๊ฐ ํ ์คํธ ์ผ์ด์ค n ๊ฐ์ด ์ ์ฅ๋ ๋ฐฐ์ด
- ์นต ํ
์คํธ ์ผ์ด์ค e ์ ๋ํด fibo(e) ๋ฅผ ํธ์ถ
- ๊ฐ๊ฐ์ fibo(e) ํธ์ถ์ O(2^n) ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์.
3. ์ต์ข ์๊ฐ ๋ณต์ก๋
๋ชจ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ ๋ณต์ก๋๋ O(T*2^n) ์ ๊ฐ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ n ์ด ์์ ์์ธ ๊ฒฝ์ฐ ํฐ ๋ฌธ์ ๊ฐ ์์ ์ ์์ง๋ง, ์ด ๋ฌธ์ ๋ N ์ด 40๋ณด๋ค ์๊ณ 0๋ณด๋ค ํฐ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฝ ์กฐ๊ฑด์ธ 0.25 ์ด ๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ฒ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ๋จ์ ์ฌ๊ท๋ก ํธ๋ ๊ฒ์ด ์๋ ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ณํ๋ฒ์ ํ์ฉํด ํธ๋ ๊ฒ์ด ์ณ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
์ฝ๋.
const [T, ...arr] = require("fs")
.readFileSync("/dev/stdin", "utf-8")
.trim()
.split("\n")
.map(Number);
const result = [];
const fibo = (N) => {
let dp = [];
for (let i = 0; i <= N; i++) {
if (i === 0) dp[i] = [1, 0];
else if (i === 1) dp[i] = [0, 1];
else dp[i] = [dp[i - 1][0] + dp[i - 2][0], dp[i - 1][1] + dp[i - 2][1]];
}
return dp[N].join(" ");
};
arr.forEach((e) => result.push(fibo(e)));
console.log(result.join("\n"));
๋์ ๊ณํ๋ฒ
๋์ ๊ณํ๋ฒ์ ๋ฌธ์ ๋ฅผ ์์ ๋จ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐ ๊ทธ ํจํด์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ๊ณ์ ๋ง๋๋ ๊ฒ์ด ์๋, ์ ์ฅ๋ ๊ฐ์ด ๋ค์ ๊ฐ์ ๊ณ์ฐ์ ์ด์ฉ๋๋ ๋ฐฉ์์ด๋ค.
์ฒ์์๋ ์ด ๋ฌธ์ ๋ฅผ ์ฒ์์ ์๋ํ ์ฝ๋์ ํจ์๋ถ๋ถ์ ํํฅ์์ผ๋ก ๊ตฌํํ๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฐ์ ๋์ง ์์๊น ์๊ฐํ๋ค.
ํ์ง๋ง, ๋จ์ํ ํผ๋ณด๋์น ํจ์์ ํํฅ์์ ์ ์ฉํ๋ฉด ์ค๋ณต ๊ณ์ฐ์ ์ต๋ํ ์ค์ด๋ ๊ณผ์ ์์ 0๊ณผ 1์ ์นด์ดํ ์ ๋น์ฐํ ์ ๋๋ก ๋ ์ ์์๋ค.
๊ทธ๋์ ๊ฒฐ๊ณผ ๊ฐ์ ํจํด์ ์ง์คํด ๋ณด์๊ณ ๊ทธ ๊ฒฐ๊ณผ
n = 0 : [0๊ฐฏ์, 1๊ฐฏ์] = [1, 0]
n = 1 : [0๊ฐฏ์, 1๊ฐฏ์] = [0, 1]
n = 2 : [0๊ฐฏ์, 1๊ฐฏ์] = [1, 1]
n = 3 : [0๊ฐฏ์, 1๊ฐฏ์] = [1, 2]
.
.
0์ ๊ฐฏ์์ 1์ ๊ฐฏ์๊ฐ n-1 ์ 0, 1 ๊ฐฏ์์ n-2 ์ 0, 1 ๊ฐฏ์์ ํฉ๊ณผ ๊ฐ์์ ์์๋ค.
๊ทธ๋ ๊ธฐ์ n ์ด 0 ์ธ ๊ฒฝ์ฐ์ 1 ์ธ๊ฒฝ์ฐ์ ๊ฐ์ dp ๋ฐฐ์ด์ ๋ฉ๋ชจ์ด์ ์ด์ ์ํค๊ณ ๊ทธ ๊ฐ์ ๋ฐํ์ผ๋ก ๊ฐ์ ๊ตฌํด๋๊ฐ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ค.
๐ฅ๋ฐฐ์ด ์
์ค๋ฒ3 ๋ฑ๊ธ์ ๋ฌธ์ ๋ผ ๋น์ฐํ ๋ฌธ์ ์์ ์ ๊ณต๋ ํจ์๋ก ํ๋ฆฌ์ง ์์ ๊ฒ์ ์์์ง๋ง, ๋จ์ํ ๊ทธ ํจ์๋ฅผ ํ๋ทธ๋ ์ด์ ์์ ํํฅ์์ผ๋ก ๋ณ๊ฒฝํด์ ํ๋ ค ํ๋ค๋ณด๋ ๊ณ ์ ๊ด๋ ์ ํฉ์ธ์ธ๊ฑฐ ๊ฐ๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ด ๋ฉ๋ชจ์ด์ ์ด์ ๋ ์์ง๋ง, ์ข๋ ๋ํ ์ผํ๊ฒ ๋ณด์๋ฉด ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋จ์์ ๋ฌธ์ ๋ก ๋ถํด ํ์ฌ ํจํด์ ํ์ ํด์ผํ๋ ์ ์ ๊ด๊ฐํ๋ค. ํ์์ dp ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ํญ์ ํผ๋ณด๋์น ํจ์ ๋ฌธ์ ์ฒ๋ผ ํ๋ฆด ๊ฑฐ๋ผ๋ ์์ผํ ์๊ฐ์ ๋น ์ ธ ํจํดํ์ ์ ๋ชปํด์ ์ด ๋์ ๊ณํ๋ฒ ๋ฌธ์ ๊ฐ ๋์ค๋ฉด ์๋ก์ด ํจํด์ ์ ์ฉํ ์๊ฐ์ ๋ชปํ๋๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋์ ๊ณํ๋ฒ์ ์กฐ๊ธ ๋ ์ดํดํ ์ ์๊ฒ ๋๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 14651 ๊ฑท๋ค๋ณด๋ ์ ์ฒ์ญ ์ผ (Large) (0) | 2025.01.02 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑ์ค 1904 01ํ์ผ (1) | 2024.12.26 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฐฑํธ๋ํน(Backtracking) (0) | 2024.11.07 |
[์๊ณ ๋ฆฌ์ฆ] ๋์ ๊ณํ๋ฒ, DP(Dydamic Programming) (0) | 2024.09.19 |
[์๊ณ ๋ฆฌ์ฆ] ์์ ๊ฒ์, ๋ฌด์ฐจ๋ณ ๋์ ๊ฒ์(Brute Force Search) (0) | 2024.08.17 |