백준_1,2,3 더하기_동적계획법(java)

2019. 3. 5. 22:21알고리즘문제/백준

1. 문제

https://www.acmicpc.net/problem/9095


정수 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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.


solution ) 

역시 넘 어렵당,,,,,, 다른 블로그 참고 !!!

R[i] = R[i-3] + R[i-2] + R[i-1]

 예를 들어 숫자 5가 주어졌을 때,

사용하는 첫 숫자가 1이라면 (5-1=4) 4를 구하는 방법의 경우의 수와 

첫 숫자가 2라면 (5-2=3) 3을 구하는 방법의 경우의 수

첫 숫자가 3라면 (5-3=2) 2를 구하는 방법의 경우의 수를 더하면 된다고 한다. 

이는 사용할 수 있는 숫자가 1,2,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
import java.util.*;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int[] res = new int[11];
        res[0= 1;
        res[1= 1;
        res[2= 2;
        res[3= 4;
        int T = sc.nextInt();
        for(int i = 0; i < T; i++) {
                int n = sc.nextInt();
                for(int j = 0; j <= n; j++) {
                    if(j>3) {
                        res[j] = res[j-3+ res[j-2+ res[j-1];
                    }
                    
                }
                System.out.println(res[n]);
                
        }
        
        sc.close();
 
    }
 
}
cs





error ) 런타임에러 발생 및 큰 숫자 (44도 그럼) 나오는 순간 값이 음수가 나온다,, n이 11이하라는 조건 무시하고 출력해봄,,

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
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        int[] arr = new int[count];
        for(int i = 0; i <  count; i++) {
                arr[i] = sc.nextInt();
        }
        
        for(int i = 0; i < count; i++) {
                int[] res = new int[arr[i]+1];
                res[0= 1;
                res[1= 1;
                res[2= 2;
                res[3= 4;
                for(int j = 0; j <= arr[i]; j++) {
                    if(j>3) {
                        res[j] = res[j-3+ res[j-2+ res[j-1];
                    }
                }
                System.out.println(res[arr[i]]);
        }
        
        sc.close();
 
    }
 
}
cs