혼자 정리

9095번: 1, 2, 3 더하기 본문

알고리즘 문풀/백준

9095번: 1, 2, 3 더하기

tbonelee 2021. 7. 18. 12:45

문제링크

C++

#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int T, n;
    cin >> T;

    int    arr[12];
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 4;
    for (int i = 4; i <= 11; i++)
    {
        arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3];
    }

    for (int i = 0; i < T; i++)
    {
        cin >> n;
        cout << arr[n] << "\n";
    }
}

Python

import sys
input = sys.stdin.readline

T = int(input())

arr = [0] * 12
arr[1] = 1
arr[2] = 2
arr[3] = 4

for i in range (4, 12):
    arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3]

for idx in range (1, T + 1):
    n = int(input())
    print(arr[n])
  • 새 경우의 수를 이전 낮은 수의 경우의 수에서 구해낼 수 있는지 여부를 보고 dp풀이가 가능할 것 같아 보이는 것을 우선 생각하고,
  • 실제 규칙성을 찾아낼 수 있었는지가 관건이었다.

어떤 수 n의 경우의 수를 구하는 것은 다음과 같이 볼 수 있다.

1) 맨 앞에 '1+'로 시작하는 경우의 수 : n - 1의 경우의 수만큼 존재
2) 맨 앞에 '2+'로 시작하는 경우의 수 : n - 2의 경우의 수만큼 존재
3) 맨 앞에 '3+'로 시작하는 경우의 수 : n - 3의 경우의 수만큼 존재

따라서 n의 경우의 수를 f(n)이라 하면 $f(n) = f(n - 1) + f(n - 2) + f(n - 3) \text{(}\forall n >3 \text{)}$의 점화식을 구할 수 있다.

'알고리즘 문풀 > 백준' 카테고리의 다른 글

14496번: 주사위 굴리기  (0) 2021.08.03
11726번: 2×n 타일링  (0) 2021.07.19
17626번: Four Squares  (0) 2021.07.17
11723번: 집합  (0) 2021.07.16
1620번: 나는야 포켓몬 마스터 이다솜  (0) 2021.07.15