문제
문제해결
- 정수 1을 1, 2, 3의 합으로 나타내는 방법은
1
총 1개
- 정수 2를 1, 2, 3의 합으로 나타내는 방법은
1 + 1
2
총 2개
- 정수 3을 1, 2, 3의 합으로 나타내는 방법은
1 + 1 + 1
1 + 2
2 + 1
3
총 4개
- 그렇다면 정수 4를 1, 2, 3의 합으로 나타내는 방법은
1 + 1 + 1 + 1
1 + 1 + 2
1 + 2 + 1
1 + 3
(4)
2 + 1 + 1
2 + 2
(2)
3 + 1
(1)
이렇게 4 + 2 + 1 = 7가지다, 잘 보면
1 + 우측에는 3을 나타내는 경우의 수(4)
2 + 우측에는 2를 나타내는 경우의 수(2)
3 + 우측에는 1을 나타내는 경우의 수(1)
즉 3의 경우의수 + 2의 경우의 수 + 1의 경우의 수인것을 볼수 있다
- 여기서 정수 5를 1, 2, 3의 합으로 나타내는 방법은
1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 2 + 1
1 + 1 + 3
1 + 2 + 1 + 1
1 + 2 + 2
1 + 3 + 1
(7)
2 + 1 + 1 + 1
2 + 1 + 2
2 + 2 + 1
2 + 3
(4)
3 + 1 + 1
3 + 2
(2)
이렇게 7 + 4 + 2가 된다
이번에도 맨 왼쪽의 숫자를 기준으로 1, 2 ,3을 나눠서 보면 4의 경우의수 + 3의 경우의 수 + 1의 경우의 수이다
그러므로 점화식인 dp 배열을 아래와 같이 정의할 수 있다
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
- 이번 문제에서는 n이 11보다 작으니 10까지의 dp 배열을 먼저 구하고 결과를 출력한다
import java.util.Scanner;
//dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
public class B9095 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int[] dp = new int[11];
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i < 11; i++) {
dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
}
for (int i = 0; i < t; i++) {
int n = sc.nextInt();
System.out.println(dp[n]);
}
}
}
'[알고리즘] > 백준' 카테고리의 다른 글
백준 16194 자바 - 카드 구매하기2 (0) | 2021.07.24 |
---|---|
백준 11052 자바 - 카드 구매하기 (0) | 2021.07.23 |
백준 11727 자바 - 2*n 타일링2 (0) | 2021.07.21 |
백준 11726 자바 - 2*n 타일링 (0) | 2021.07.20 |
백준 1463 자바 - 1로 만들기 (0) | 2021.07.19 |