백준 9095 JavaScript
수정하기
문서 생성 2021-11-22 15:08:09 최근 수정 2022-01-14 16:52:22
문제
풀이
어떻게 푸는지 감이 잡히지 않아서 다른 사람들이 푼 풀이를 참고했다.
1, 2, 3을 합해서 숫자를 만드는 조합들을 살펴보면 규칙이 있다.
1 // 12 // 1+1, 23 // 1+1+1, 1+2, 2+1, 34 // [1+3] 1+3// [2+2] 1+1+2, 2+2// [3+1] 1+1+1+1, 1+2+1, 2+1+1, 3+15 // [1+4] 1의 경우의 수 + 4 (1, 2, 3의 조합이므로 제외)// [2+3] 2의 경우의 수 + 3// [3+2] 3의 경우의 수 + 2// [4+1] 4의 경우의 수 + 1
숫자 5를 예로 들면, 1과 4의 조합, 2와 3의 조합, 3과 2의 조합, 4와 1의 조합으로 나타낼 수 있는데 여기서 1+4는 1이 만들어지는 조합의 경우의 수에 각각 4를 더하는 것이다. 하지만 문제는 1, 2, 3의 합으로만 나타내야 하기 때문에 제외해야 한다. 그래서 다음과 같은 식이 나오게 된다.
방법의 수(A(n)) = A(n-1) + A(n-2) + A(n-3)
const readFileSyncPath = require('path').basename(__filename).replace(/js$/, 'txt');// const readFileSyncPath = '/dev/stdin';const input = require('fs').readFileSync(readFileSyncPath).toString().trim().split("\n");const num = input.slice(1).map(Number);const maxNum = Math.max(...num);const DP = new Array(maxNum + 1).fill(0);DP[1] = 1;DP[2] = 2;DP[3] = 4;DP.forEach((v, i) => {if (i > 3) {DP[i] = DP[i - 1] + DP[i - 2] + DP[i - 3];}});num.forEach(v => {console.log(DP[v]);});