백준 1,2,3더하기(9095) 문제이다.
( 문제 바로가기 )
[ 문제설명 ]
- 테스트 케이스의 갯수가 입력으로 주어지고, 각 테스트 케이스마다 정수 하나가 입력으로 주어진다.
- 그 정수를 1,2,3 3개의 숫자만을 이용해서 더해서 그 수를 출력시켜야 하는 경우의 수를 출력시키는 문제이다.
[ 문제풀이 ]
1) 작은 숫자부터 생각을 해보면
1이 주어졌을 때 1을 1,2,3 3개를 이용해 만들 수 있는 경우의 수는 (1) 1개이다.
2 는 (1+1, 2) 2개이다. 3은 (1+1+1 , 1+2, 2+1, 3) 4개이다.
4의 경우는 ?? 4는 크게보면 (1+3, 2+2, 3+1) 3가지가 있는데, 이 중에서
(4-3)+3 에서 3을 만드는 경우의 수 = 4개
(4-2)+2 에서 2를 만드는 경우의 수 = 2개
(4-1)+1 에서 1을 만드는 경우의 수 = 1개
총 7개가 된다. 실제로 문제에서 주어진 대로 7가지의 경우의 수가 존재한다.
위에서, 1,2,3을 (4-3 , 4-2, 4-1)로 표시한 것은 이러한 과정을 통해서 점화식을 도출해 낼 수 있기 때문이다.
2) 위의 이론을 통해서 점화식을 도출해 내보면
Arr[N] = Arr[N-1] + Arr[N-2] + Arr[N-3]이 성립하게된다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include<iostream> #define endl "\n" #define MAX 11 using namespace std; int N; int Arr[MAX]; void Input() { cin >> N; } void Solution() { // 1을 만들수 있는 방법 = 1 (1) // 2를 만들수 있는 방법 = 2 (1+1) , (2) // 3을 만들수 있는 방법 = 3 (1+1+1) , (1+2) , (2+1) , (3) // 4를 만들수 있는 방법 = ?? Arr[0] = 0; Arr[1] = 1; Arr[2] = 2; Arr[3] = 4; for (int i = 4; i <= N; i++) { Arr[i] = Arr[i - 1] + Arr[i - 2] + Arr[i - 3]; } cout << Arr[N] << endl; } void Solve() { int Tc; cin >> Tc; for (int T = 1; T <= Tc; T++) { Input(); Solution(); } } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 11052 ] 카드 구매하기 (C++) (5) | 2018.11.30 |
---|---|
[ 백준 10844 ] 쉬운 계단 수 (C++) (4) | 2018.11.29 |
[ 백준 2579 ] 계단오르기 (C++) (3) | 2018.11.29 |
[ 백준 2193 ] 이친수 (C++) (0) | 2018.11.29 |
[ 백준 2156 ] 포도주시식 (C++) (0) | 2018.11.29 |