로직
동물을 윗 칸부터 아래로 채워가는 형태로 생각
동물을 배치하는 방법은 기본적으로 3가지(배치x, 왼쪽 배치, 오른쪽 배치)
배치를 안할 경우 윗칸에 동물 여부에 상관 없음
왼쪽에 배치할 경우 윗칸에 배치가 안되었거나, 왼쪽에 배치되어 있어야 함
오른쪽에 배치할 경우 윗칸에 배치가 안되었거나, 오른쪽에 배치되어 있어야함
그렇기에 배치를 안한 경우의수, 왼쪽에 배치한 경우의 수, 오른쪽에 배치한 경우의 수를 계산해야함
배치를 안한 경우의 수는 윗칸 모든 경우의 수(배치를 안한 경우 + 왼쪽에 배치한 경우 + 오른쪽에 배치한 경우)
왼쪽에 배치하는 경우의 수는 윗칸에서 (배치를 안 한 경우 + 오른쪽에 배치한 경우)
오른쪽에 배치하는 경우의 수는 윗칸에서 (배치를 안 한 경우 + 왼쪽에 배치한 경우)
이를 누적해가며 계산하는 방식
현재 칸에서 계산이 끝난 경우, 윗칸의 경우의 수는 더 이상 쓸모가 없음 => 메모리 낭비
- 그렇기에 기록하는 배열을
N*3
이 아닌2*3
으로 만들어 메모리 낭비를 줄임
- 그렇기에 기록하는 배열을
const solution = (N,mod)=>{
const dp = Array.from({length:2},()=>Array.from({length:3}).fill(1));
for (let cnt=1;cnt<=N;cnt++){
const [bi,ni] = [(cnt-1)%2,cnt%2];
dp[ni][0] = (dp[bi].reduce((total,value)=>total+value,0))%mod;
dp[ni][1] = (dp[bi][0] + dp[bi][2])%mod;
dp[ni][2] = (dp[bi][0] + dp[bi][1])%mod;
};
return dp[N%2][0];
}
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let N;
const mod = 9901;
rl.on('line', (line) => {
N = parseInt(line);
rl.close();
});
rl.on('close', () => {
const ans = solution(N,mod);
console.log(ans);
});
후기
- readline을 사용해보려고 했으나, 이번 문제의 경우 N 단 한가지 값만 존재하다 보니 의미가 없어서 써야하나 했지만, 써보기로 했으므로 일단 사용했다
- for of 구문에서 const 선언을 주로 사용하다 보니 const cnt를 선언하고 왜 작동을 안하지? 라는 의문이 생겼었다... javascript가 익숙해질 때 까지 많이 남았다.
'알고리즘 문제 풀이 > Javascript' 카테고리의 다른 글
[node.js] 백준 8979 올림픽 (0) | 2025.02.03 |
---|---|
[node.js] 백준 13023 ABCDE (0) | 2025.01.22 |
[node.js] 1347 미로만들기 (0) | 2025.01.15 |
[node.js] 16507 어두운 건 무서워 (0) | 2025.01.14 |
[node.js] 1331 나이트투어 with Python (0) | 2025.01.13 |