2193 이친수

문제 분석

N=1N=2N=3N=4N=5
110100100010000
101100110001
101010010
10100
10101
총 개총 1개총 2개총 3개총 5개

위 패턴을 통해 알 수 있는 것은 이 문제가 피보나치 수열 문제라는 것이다.

피보나치 수열 점화식

memo[N] = memo[N-1] + memo[N-2];

풀이

위 점화식을 적용하여 풀이하면 다음과 같다.

const N = +require('fs').readFileSync('dev/stdin');
const memo = new Array(N);
memo[0] = 1;
memo[1] = 1;

for (let i = 2; i < N; i++) {
  memo[i] = memo[i - 1] + memo[i - 2];
}

console.log(memo[N - 1]);

하지만 위 풀이를 제출하면 오답이다. 이는 Number 타입으로 처리하게되면 최대 정수값(2^53)을 넘기는 경우가 발생하기 때문이라고 한다.

이 문제를 해결하기 위해 BigInt 자료형으로 변환 후, 다시 String 문자열로 변환해준다. String 자료형으로 변환하는 이유는 BigInt 자료형을 사용할 경우 끝에 'n'이 붙기 때문이다.

최종 풀이

const N = +require('fs').readFileSync('dev/stdin');
const memo = new Array(N);
memo[0] = 1;
memo[1] = 1;

for (let i = 2; i < N; i++) {
  memo[i] = BigInt(memo[i - 1]) + BigInt(memo[i - 2]);
}

console.log(String(memo[N - 1]));