2019. 5. 6. 16:19ㆍ알고리즘/동적 프로그래밍
문제
정수 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의 합으로 나타내는 방법의 수를 출력한다.
예제 입력
3
4
7
10
예제 출력
7
44
274
접근 방법
예시에서 정수가 4일 때와 7일 때의 방법의 수(경우의 수)를 알 수 있다.
그래서 주어진 정수가 5와 6일 때를 한 번 구하면
정수가 4, 5, 6일 때의 경우의 수를 더하니 정수가 7일 때의 경우의 수와 같았다.
그렇다면
어떤 정수 n이 있으면 n-1, n-2, n-3 을 만들 수 있는 경우의 수를 더하면 될 것인가.
그래서 정수 1, 2, 3, 4, 5 까지 경우의 수를 수작업으로 구해 보았다.
1 - 1 (1개)
2 - 1+1, 2 (2개)
3 - 1+1+1, 2+1, 1+2, 3 (4개)
그러면 4는 1(4-3)에서 3을 더한 것, 2(4-2)에서 2를 더한 것, 3(4-1)에서 1을 더한 것이다.
그러니 4는 정수 1, 2, 3의 경우의 수를 더한 것과 같다.(1+2+4 = 7)
즉, 1, 2, 3 으로 정수 n을 만드는 경우의 수 A(n)는 A(n) = A(n-1) + A(n-2) + A(n-3) 이다.
코드
public class Main {
public static void main(String[] args) {
int[] arr = new int[11];
int T, n;
Scanner scanner = new Scanner(System.in);
arr[0] = 0; // 정수가 0일 때 방법(경우)의 수
arr[1] = 1; // 정수가 1일 때 경우의 수, 1 => 1개
arr[2] = 2; // 정수가 2일 때 경우의 수, 1+1, 2 => 2개
arr[3] = 4; // 정수가 3일 때 경우의 수, 1+1+1, 1+2, 2+1, 3 => 4개
T = scanner.nextInt();
for(int i = 0; i < T; i++) {
n = scanner.nextInt();
for(int j = 4; j <= n; j++){
arr[j] = arr[j-1] + arr[j-2] + arr[j-3];
}
System.out.println(arr[n]);
}
scanner.close();
}
}
'알고리즘 > 동적 프로그래밍' 카테고리의 다른 글
백준 1890 점프 (0) | 2019.05.06 |
---|---|
백준 2293 동전1 (0) | 2019.05.06 |