본문으로 건너뛰기

BOJ - 극장 좌석

BOJ - 극장 좌석

https://www.acmicpc.net/problem/2302

접근 방법

  • 좌석 중 VIP 좌석을 기준으로 좌석 배열을 나눈 그룹에 대해 경우의 수를 계산하면 된다.
  • 그룹 내 좌석의 개수에 대해 다음과 같은 규칙성을 갖는다.
    • 1개 : 1
    • 2개 : 2
    • 3개 : 3
    • 4개 : 5
    • … 피보나치 수열과 동일한 규칙성을 갖는다.
  • 따라서 DP 배열을 피보나치 수열에 대한 점화식으로 초기화해주고, 결과를 계산하면 끝!

Code

let file = require("fs").readFileSync("/dev/stdin");
let input = file.toString().split("\n");

let n = Number(input[0]);
let m = Number(input[1]);

let d = new Array(50).fill(0);
d[0] = 1;
d[1] = 1;
d[2] = 2;

const dp = (x) => {
if (d[x] != 0) return d[x];
d[x] = dp(x - 1) + dp(x - 2);
return d[x];
};

let arr = [];
let start = 0;
for (let i = 2; i < m + 2; i++) {
end = Number(input[i]);
arr.push(end - 1 - start);
start = end;
}
arr.push(n - start);

let res = 1;
for (let x of arr) {
res *= dp(x);
}
console.log(res);