알고리즘/DP
[JS] 2×n 타일링 - 백준 11726
슈크림 붕어빵
2023. 12. 21. 12:52
문제
시간복잡도
O(n)
해결 방법
위 그림처럼 dp[i]는 dp[i-1]에 세로 블럭을 하나 더한 것과 dp[i-2]에 가로 블럭을 두개 더한 값이다.
dp[i]=dp[i-1]+dp[i-2]
참고 - 최대 정수값
자바 스크립에서 안전한 최대 정수값은 2^53 - 1 이다.
다음과 같이 이 값을 넘어가면 같은 숫자로 인식하여 정확한 값이 나오지 않는다.
이 문제에서는 10007로 나눈 나머지를 구하라고 했으니 먼저 나눠서 저장해주자.
console.log에서 %10007을 하면 런타임 에러가 난다.
const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(Number.MAX_SAFE_INTEGER);
// Expected output: 9007199254740991
console.log(x);
// Expected output: 9007199254740992
console.log(x === y);
// Expected output: true
코드
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./example.txt";
let input = fs.readFileSync(filePath).toString();
input = parseInt(input);
dp = [0, 1, 2, 3, 5];
for (let i = 5; i <= input; i++) {
dp[i] = (dp[i - 2] + dp[i - 1]) % 10007;
}
console.log(dp[input]);
출처: (최대 정수값) https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER