‡ CODING TEST STUDY ‡/º 백준

[백준 9461번 C++] 파도반 수열

Trudy | 송연 2023. 10. 7. 11:41

9461번: 파도반 수열 (acmicpc.net)

 

9461번: 파도반 수열

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

www.acmicpc.net


규칙성을 찾는 게 중요한 다이나믹 프로그래밍 유형,,

1, 1, 1, 2, 2, 3, 4, 5, 7, 9

점화식을 세워보면 

 

P(1) = 1

P(2) = 1

P(3) = 1

n>3일 때, P(n) = P(n-3) + P(n-2) 

 

또,, 가장 쉽게 생각할 수 있는 재귀 방법으로 풀었는 데 시간 초과가 떴다

 

#include <iostream>

using namespace std;

int pado(int n) {
    if(n==1 | n==2 | n==3){
        return 1;
    }
    
    return pado(n-3) + pado(n-2);
}

int main()
{
    int t, n;
    cin >> t;
    
    for(int i=0; i<t; i++){
        cin >> n;
        
        cout << pado(n) << "\n";
    }
    
    
    
    return 0;
}

[백준] 9461 파도반 수열 C++ (DP) (velog.io)

 

[백준] 9461 파도반 수열 C++ (DP)

📌백준 9461 파도반 수열https://www.acmicpc.net/problem/9461d1 = 1d2 = 1d3 = 1d4 = 2d5 = 2으로 정해주고,6번째부터 규칙이 시작된다.d6 = 3d7 = 4d8 = 5d9 = 7d10 =9...여기서 규칙을

velog.io

 

문제였던 부분이

 

1. long long의 자료형을 써야한다는 것

2. 재귀를 사용하지 말고 dp를 써야 함

3. d[N] = d[N-5] + d[N-1] 를 사용해야함

 

그렇게 수정된 코드는!

#include <iostream>

using namespace std;

int main()
{
    int t, m;
    long long n[101] = {1, 1, 1, 2 , 2 ,};
    
    for(int i=5; i<101; i++){
        n[i] = n[i-1] + n[i-5];
    }
    
    cin >> t;
    
    for(int i=0; i<t; i++){
        cin >> m;
         cout << n[m-1] << "\n";
    }
    
    
    
    return 0;
}