문제
풀이
DP(동적 계획법) 문제이므로 DP로 접근한다.
다음 N * 2 행렬의 N번째 행만을 기준으로 생각하자.
N번째 행에 사자가 없다면 E, 사자가 있다면 I로 나타내본다.
N=1일 때, 경우의 수는 E=1, I=2 로 총 3이다.
N=2일 때, N=1의 경우의 수 각각에 2번째 행이 생성되었을 때를 생각하면
E=1로부터 E=1, I=2 생성
I=2로부터 각각 E=1, I=1이 생성되므로 총 E=2, I=2가 생성
그러므로 N=2의 경우의 수는 E=1+2, I=2+2로 총 7이다.
계속해서 진행하면,
N=3일 때, N=2의 경우의 수 각각에 3번째 행이 생성되므로
E=3으로부터 E=3, I=6 생성
I=4로부터 총 E=4, I=4 생성
N=3의 경우의 수는 E=3+4, I=6+4 이다.
사실 이 식을 잘 보면,
cur(E) = prev(E) + prev(I)
cur(I) = (prev(E) * 2) + prev(I)
로 나타낼 수 있다.
코드
const sol = (n) => {
const MOD = 9901;
const dp = Array.from({ length: 2 }, () => new Array(2).fill(0));
dp[1][0] = 1;
dp[1][1] = 2;
for (let i = 2; i <= n; i++) {
const cur = i % 2;
let prev;
if (cur === 1) prev = 0;
else prev = 1;
dp[cur][0] = (dp[prev][0] + dp[prev][1]) % MOD;
dp[cur][1] = (dp[prev][0] * 2 + dp[prev][1]) % MOD;
}
console.log((dp[n % 2][0] + dp[n % 2][1]) % MOD);
};
require("readline")
.createInterface(process.stdin, process.stdout)
.on("line", (line) => {
sol(+line);
})
.on("close", () => {
process.exit();
});
dp 배열 크기를 N x 2로 선언해도 되지만,
다음과 같이 2 x 2 크기로 선언하고
홀짝에 따라 0,1번 인덱스로 이동하면서 연산을 수행할 수 있다.
'DS & Algorithm > baekjoon' 카테고리의 다른 글
[백준] 13023번 ABCDE - JavaScript(NodeJS) (0) | 2021.05.27 |
---|---|
[백준] 1932번 정수삼각형 - JavaScript(NodeJS) (0) | 2021.05.17 |
[백준] 1406번 에디터 - JavaScript(NodeJS) (2) | 2021.05.02 |
[백준] 9093번 단어 뒤집기 - JavaScript(NodeJS) (0) | 2021.05.01 |
[백준] 10828번 스택 - JavaScript(NodeJS) (0) | 2021.05.01 |