문제
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
예제 입력 1
3
4
7
10
예제 출력 1
7
44
274
문제 요약
- 정수 n을 1개 이상의 1, 2, 3의 합으로 나타낼 수 있는 경우의 수 구하기
풀이 방법
- 동적계획법
- 정수별로 경우의 수를 나타내는 dp배열 생성 (n은 11 미만 정수 => 인덱스로 인해 헷갈리지않도록 10이아닌 11인 배열 생성)
- dp[1] = 1 : 1
- dp[2] = 2 : 1+1, 2
- dp[3] = 4 : 1+1+1, 1+2, 2+1, 3
어떤 정수의 경우의 수는 이전 수의 경우의 수들에 1, 2, 3을 더한 경우만 추가해주면 된다.
예를 들어 dp[4]의 경우,
- dp[3] 과 1을 더하는 경우 = 4가지 : 1+1+1+1, 1+2+1, 2+1+1, 3+1
- dp[2] 와 2를 더하는 경우 = 2가지 : 1+1+2, 2+2
- dp[1] 과 3을 더하는 경우 = 1가지 : 1+3
따라서 dp[4] =7이다.
결론적으로 dp[n] 은 n의 직전 3개의 정수에 1, 2, 3을 더한 경우를 구해 합하면 된다.
dp[n] = dp[n-3] + dp[n-2] + dp[n-1]
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n")
.map(Number);
const T = input.shift();
const dp = new Array(11);
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (let i = 4; i <= Math.max(...input); i++) {
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
}
input.forEach((num) => console.log(dp[num]));
'CS > 알고리즘' 카테고리의 다른 글
[Javascript] 백준 14530: 로봇 청소기 (0) | 2023.01.19 |
---|---|
[Javascript] 백준 1260: DFS와 BFS (0) | 2023.01.14 |
[Javascript] 백준 2579: 계단오르기 (0) | 2023.01.05 |
[Javascript] 백준 1463: 1로 만들기 (0) | 2023.01.05 |
[Javascript] 백준 7568: 덩치 (0) | 2023.01.03 |
댓글