문제
정수 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) 테이블 정의하기
D[i] = i 를 1, 2, 3의 합으로 나타내는 방법의 수
(2) 점화식 찾기
D[4] 의 경우의 수를 생각해보자.
1+1+1+1, 3+1, 2+1+1, 1+2+1 (3을 1,2,3의 합으로 나타내는 방법) +1 , D[3]
1+1+2, 2+2 (2를 1,2,3의 합으로 나타내는 방법) +2, D[2]
1+3 (1을 1,2,3의 합으로 나타내는 방법) +3, D[1]
⇒ D[4] = D[1] + D[2] + D[3]
(3) 초기값 설정하기
D[1] = 1, D[2] = 2, D[3] = 4
D[i] = D[i - 1] + D[i - 2] + D[i - 3] 이니 초기값이 최소 3개는 주어져야 한다.
풀이
import java.io.*;
public class Main {
public static void countSum(int n) {
int[] dp = new int[11];
dp[1] = 1; dp[2] = 2; dp[3] = 4;
for(int i = 4; i <= n; i++)
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
System.out.println(dp[n]);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
while(n-- != 0)
countSum(Integer.parseInt(br.readLine()));
}
}
© 참고
https://www.acmicpc.net/problem/9095
https://blog.encrypted.gg/974?category=773649
'Study > algorithm' 카테고리의 다른 글
[백준/Java] 9095 1, 2, 3 더하기* (feat. 브루트포스/완전탐색) (0) | 2021.10.12 |
---|---|
[백준/Java] 11723 집합 (feat. 비트마스크) (0) | 2021.10.12 |
[백준/Java/DP] 11726 2xn 타일링 (feat. 다이나믹 프로그래밍) (0) | 2021.10.06 |
[백준/Java] 9613 GCD 합 (feat. 유클리드 호제법) (0) | 2021.10.06 |
[백준/Java] 1676 팩토리얼 0의 개수* (0) | 2021.10.06 |