알고리즘/PS - 백준

[백준 9461 - C++] 파도반 수열 : DP

excited-hyun 2021. 5. 9. 23:43
반응형

www.acmicpc.net/problem/9461

 

9461번: 파도반 수열

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

www.acmicpc.net

문제

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 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)을 출력한다.

 

예제 입력 1 

2

6

12

예제 출력 1 

3

16

 

풀이

규칙을 잘 찾아서 점화식을 작성해서 풀었다!.

N이 6보다 작을 때는 그냥 1, 1, 1, 2, 2 이렇게 넣어줬는데 저 부분도 나타낼 방법이 없는지 궁금하당ㅋㅋㅋㅋㅋ

 

이 문제에서 가장 중요한 것은!! int형으로 배열을 쓰면 안된다.

처음엔 그냥 int로 하고서 혹시나? 하고 n=100인 입력을 해보니 역시 오버플로우가 나서 요상한 숫자가 나왔다.

반드시 long long을 사용하자!!!

 

#include <iostream>
#include <cstdio>

long long arr[101];

int main (void){
    int tc, n;
    
    scanf("%d", &tc);
    
    for(int i=0; i<tc; i++){
        scanf("%d", &n);
        arr[1] = 1;
        arr[2] = 1;
        arr[3] = 1;
        arr[4] = 2;
        arr[5] = 2;
     
        
        for(int j=6; j<n+1; j++){
            arr[j] = arr[j-1] + arr[j-5];
        }
        printf("%lld\n", arr[n]);
    }
}
728x90
반응형