BOJ

[BOJ] 9461번 : 파도반 수열 (C++)

hg_studio 2023. 4. 12. 14:22

https://www.acmicpc.net/problem/9461

 

9461번: 파도반 수열

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

www.acmicpc.net

 

dp문제이다. 

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다.

P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

수열을 보게 되면 피보나치와 같은 규칙이 있음을 알 수 있다. 

내가 i번째 수라고 했을 때, i번째 수는 i-3번째 수와 i-2번째 수를 더한 값이 되는 것이다. 

따라서 d[i] = d[i-3]+d[i-2]; 가 된다. 

테스트케이스가 T번 나오므로 그 때마다 dp를 돌려 값을 구하는 것보다, 아예 d배열을 모두 채우고 필요한 값을 가져다쓰는 것이 더욱 효율적이다. 

그래서 1 ≤ N ≤ 100이므로 값이 int범위를 벗어날 수 있다. 

int형 대신 long long형을 써주어야 통과할 수 있다. 

 

추가로 또다른 규칙을 찾을 수 있다. 

현재 i번째 수는 i-5번째 수와 i-1번째 수를 더하여 구할 수도 있다.

 

#include <iostream>
using namespace std;
typedef long long ll;

//d[i]=k : k값은 p(i)이 됨
//d[i] = d[i-3]+d[i-2];
ll d[102]; 

int main(){
    //초기값 설정
    d[1]=1; d[2]=1; d[3]=1;
    
    for(int i=4; i<=100; i++){
        d[i] = d[i-3]+d[i-2];
    }

    int tc; cin>>tc;
    while(tc--){
        int x; cin>>x;
        cout<<d[x]<<'\n';
    }
}