[BOJ][C++] 백준 9095번 1, 2, 3 더하기

Updated:

9095번 1, 2, 3 더하기

1. 문제 정보

백준 온라인 저지 [9095번 1, 2, 3 더하기] 문제의 링크입니다.

문제

정수 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

시간 / 메모리 제한

1초 / 128MB


2. 생각

  1. 주어진 문제 n을 나타내는 방법의 수를 쪼개어 n-1, n-2, n-3 … 1 작은 문제로 만들 수 있습니다.
    또, 작은 문제의 해답을 합쳐 큰 문제를 풀 수 있으므로 다이나믹프로그래밍 방법으로 문제를 풀겠습니다.

  2. 가장 마지막에 어떤 숫자를 더할 수 있는지 경우의 수를 생각해보는 방법으로 Bottom-up 방식으로 풀겠습니다.
    dp배열은 각 원소에 해달하는 정수를 1, 2, 3의 합으로 나타내는 방법의 수를 저장합니다.
    0 0             1
    1 0+1             1
    2 1+1 0+2           2
    3 1+1+1 2+1 1+2 0+3       4
    4 1+1+1+1 2+1+1 1+2+1 3+1 1+1+2 2+2 1+3 7
  3. n번째 정수를 1, 2, 3의 합으로 나타내는 경우는 3가지가 있습니다.

    1) 1을 더하는 경우 -> dp[n-1]의 방법의 수에 각각 1을 더합니다.

    2) 2를 더하는 경우 -> dp[n-2]의 방법의 수에 각각 2를 더합니다.

    3) 3을 더하는 경우 -> dp[n-3]의 방법의 수에 각각 3을 더합니다.

    1), 2), 3)의 경우를 모두 더해야 정수 n을 1, 2, 3의 합으로 나타내는 방법의 수를 구할 수 있습니다. 따라서, dp[n] = dp[n-1] + dp[n-2] + dp[n-3]의 점화식을 도출할 수 있습니다.

  4. dp[0], dp[1], dp[2]의 경우는 일반항으로 초기값을 정해줍니다. i=3부터 반복문을 통해 구할 수 있습니다.
    dp[0]을 1로 초기화한 이유는 dp[3]의 경우에서 0+3도 3의 합으로 표현할 수 있기 때문에 1가지로 세도록 1로 초기화했습니다.

3. 소스코드 (C++)


터미널의 입출력 화면 예제1

9095_1

터미널의 입출력 화면 다른 예제

9095_2 9095_3