1 minute read

문제

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다.

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.

규칙성 찾기

1
1
1
2
2
1 + 2 = 3 (1, 5)
1 + 3 = 4 (2, 6)
1 + 4 = 5 (3, 7)
2 + 5 = 7 (4, 8)
2 + 7 = 9 (5, 9)
3 + 9 = 12(6, 10)

생각한 알고리즘

  • 6번째 수열부터는 a_n = a_(n-1) + a_(n-5)를 따른다.
  • 다음 점화식을 이용하여 프로그램을 작성한다.
#include <iostream>

using namespace std;

int main(void)
{
    int count;
    cin>>count;
    int input[110];
    for(int i = 0; i< count; i++)
    {
        cin>>input[i];
    }

    long int arr[110];
    arr[1] = 1;
    arr[2] = 1;
    arr[3] = 1;
    arr[4] = 2;
    arr[5] = 2;
    int fill = 6;

    for(int i = 0; i <count; i++)
    {

        while(fill <= input[i])
        {
            arr[fill] = arr[fill-1] + arr[fill-5];
            fill += 1;
        }
        cout<<arr[input[i]]<<endl;
    }
    return 0;

}