시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 (추가 시간 없음) | 512 MB | 73765 | 47925 | 32043 | 63.149% |
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
3
4
7
10
7
44
274
import java.io.*;
public class P_9095 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
int[] num = new int[11];
num[0] = 0;
num[1] = 1;
num[2] = 2;
num[3] = 4;
for (int i = 4; i < 11; i++) {
num[i] = num[i - 1] + num[i - 2] + num[i - 3];
}
for (int i = 0; i < t; i++) {
bw.write(num[Integer.parseInt(br.readLine())] + "\n");
}
bw.flush();
}
}
DP를 이용해서 풀었다.
1 -> 1개
2 -> (1 + 1), 2 -> 2개
3 -> (1 + 1 + 1), (2 + 1), 3 -> 1 + 2 + 1 = 4개
4 -> (1 + 1 + 1 + 1), (2 + 1 + 1), (3 + 1), (2 + 2) -> 1 + 3 + 2 + 1 = 7
5 -> (1 +1 +1 + 1 + 1), (2 + 1 + 1 + 1), (3 + 1 + 1), (2 + 2 + 1), (3 + 2) -> 1 + 4 + 3 + 3 + 2 = 13
6 -> (1 + 1 + 1 + 1 + 1 + 1), (2 + 1 + 1 + 1 + 1), (3 + 1 + 1+ 1), (2 + 2 + 1 + 1), (3 + 2 + 1), (2 + 2 + 2) + (3 + 3) -> 1 + 5 + 4 + 6 + 6 + 1 + 1 = 24
7 -> (1 + 1 + 1 + 1 + 1 + 1 + 1), (2 + 1 + 1 + 1 + 1 + 1), (2 + 2 + 1 + 1 +1), (2 + 2 + 2 + 1), (3 + 1 + 1 +1 + 1), (3 + 3 + 1), (2 + 3 + 1 + 1), (2 + 3 + 2) -> 1 + 6 + 10 + 4 + 5 + 3 + 12 + 3 = 44
5의 경우 7 + 4 + 2 = 13이고,
6의 경우 13 + 7 + 4 = 24이고,
7의 경우 24 + 13 + 7 = 44이다.
즉, 11칸의 배열을 만들어 놓고 각각의 수를 저장해 놓는다.
5의 답을 구한다고 하면, arr[5] = arr[5 - 1] + arr[5 - 2] + arr[5 - 3] = 13이므로 이런 식으로 증가시켜가며 [i - 1] + [i - 2] + [i - 3]으로 답을 구한다.