본문 바로가기
CS/알고리즘

[Javascript] 백준 9095: 1, 2, 3 더하기

by s0ojin 2023. 1. 7.

문제

정수 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]));

댓글