[문제] 백준 알고리즘 9461 (파도반 수열)
> https://www.acmicpc.net/problem/9461
9461번: 파도반 수열
문제 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다. 파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다. N이 주어졌을 때, P(N)을 구하
www.acmicpc.net
나선에서 가장 긴 변의 길이를 갖는 정삼각형을 계속 추가하는 수열 문제이다.
DP문제이며, 점화식을 구해야하므로 아래처럼 표를 작성하여 규칙을 찾는다.
| N | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
| 길이 | X | 1 | 1 | 1 | 2 | 2 | 3 | 4 | 5 | 7 | 
| N=4 | + | + | 1+1=2 | |||||||
| N=5 | + | + | 1+2=3 | |||||||
| N=6 | + | + | 1+3=4 | |||||||
| N=7 | + | + | 1+4=5 | |||||||
| N=8 | + | + | 2+5=7 | |||||||
| 점화식 : dp[n] = dp[n-1] + dp[n-5] (n >= 7) | ||||||||||
점화식 dp[n] = dp[n-1] + dp[n-5] (n >= 7)을 알 수 있다.
[문제 해결]
1. 테스트 갯수 t를 받고, dp[101]을 선언
2. dp[6]까지 초기값으로 할당
3. dp[7]부터 101번째까지 dp[n] = dp[n-1] + dp[n-5]대로 값 할당
4. n 입력에 따라 dp[n] 출력
[C++]
#include <cstdio>
#include <cstring>
using namespace std;
long long dp[101] = { 0, 1, 1, 1, 2, 2, 3 };
void wave() {
	for (int i = 7; i <= 101; i++) {
		dp[i] = dp[i - 1] + dp[i - 5];
	}
}
int main() {
	int T;
	scanf("%d", &T);
	wave();
	for (int t = 0; t < T; t++) {
		int n;
		scanf("%d", &n);
		printf("%lld\n", dp[n]);
	}
	return 0;
}
[Python]
import sys
input = sys.stdin.readline
t = int(input())
dp = [0 for _ in range(101)]
def wave():
    dp[1], dp[2], dp[3] = 1, 1, 1
    dp[4], dp[5] = 2, 2
    dp[6] = 3
    for i in range(7, 101):
        dp[i] = dp[i-1] + dp[i-5]
    return
for _ in range(t):
    n = int(input())
    wave()
    print(dp[n])
728x90
    
    
    
  '백준 알고리즘(BOJ)' 카테고리의 다른 글
| 백준 알고리즘 2630 (색종이 만들기) - C++, Python (0) | 2019.11.08 | 
|---|---|
| 백준 알고리즘 1149 (RGB거리) - C++, Python (0) | 2019.11.07 | 
| 백준 알고리즘 1904 (01타일) - C++, Python (0) | 2019.11.03 | 
| 백준 알고리즘 2748 (피보나치 수 2) - C++, Python (0) | 2019.10.29 | 
| 백준 알고리즘 1003 (피보나치 함수) - C++, Python (0) | 2019.10.27 | 
댓글