그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다.
파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.
N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. (1 ≤ N ≤ 100)
각 테스트 케이스마다 P(N)을 출력한다.
수열의 특정 순서 값을 구하는 문제는 경우에 따라 DP로 해결할 수도 있다.
특히, 이번처럼 특정 순서의 값이 이전 값들에게 영향을 받는 경우 DP로 문제를 해결하면 시간을 훨씬 아낄 수 있다.
그러한 문제의 경우 수열의 규칙을 찾아내고 나면 문제가 해결된다.
이번 문제에서는 일때 DP[] = DP[] + DP[]의 식을 만족한다.
import java.util.Scanner;
public class BJ9461 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int test = sc.nextInt();
long[] DP = new long[100];
DP[0] = 1l;
DP[1] = 1l;
DP[2] = 1l;
DP[3] = 2l;
DP[4] = 2l;
DP[5] = 3l;
DP[6] = 4l;
DP[7] = 5l;
DP[8] = 7l;
DP[9] = 9l;
for(int i = 10; i<100; i++){
DP[i] = DP[i - 1] + DP[i - 5];
}
for (int testNum = 0; testNum < test; testNum++) {
int n = sc.nextInt();
System.out.println(DP[n - 1]);
}
}
}