https://www.acmicpc.net/problem/9461
백준 파도반 수열 문제를 해결하기 위해서는 규칙(점화식) 을 찾아내면된다.
🌘문제 이해하기
- 첫 삼각형은 정삼각형으로 변의 길이가 1
- 정삼각형을 계속 추가하는데 나선의 가장 긴변의 길이가 k라고 했을때 , 그 변의 길이가 k인 정삼각형을 추가한다.
- P(N) 은 나선에 있는 정삼각형의 변의 길이 이다.
- N이 주어졌을 때 P(N)을 구하는 프로그램 작성
🌗 문제 자세히보기
처음에는 무슨삼격형이야? 무슨 규칙이야 싶은데 하나씩 그려보면된다.
순서 : 삼각형 한 변의 길이
1 : 1
2 : 1
3 : 1
4 : 2
5 : 2
6 : 3
7 : 4
8 : 5
9 : 7
..
1,2,3 번째 순서는 한변의 길이가 1로 고정이고
4번째부터는 2번째와 1번째의 삼각형의 변의 길이의 합 = 1 + 1 = 2
5번째는 3번째와 2번째의 삼각형의 변의 길이의 합 = 1+1 = 2
6번째는 4번째와 3번째의 삼각형의 변의 길이의 합 = 2+1 = 3
인걸 확인할 수 있다.
점화식으로 dp[i] = dp[i-2]+ dp[i-3] 나타낼 수 있다.
🚨주의해야할 점
1. N이 100 까지 주어지므로 변수타입이 int를 벗어나 long으로 지정
2. N이 1 2, 3 일때의 경우를 놓치면 안된다.
🌕최종코드
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int[] test = new int[t];
//테스트 케이스 만큼 입력받기
for(int i=0;i<t;i++)
{
test[i] = Integer.parseInt(br.readLine());
}
long[] dp = new long[101];
dp[1] = 1;
dp[2] = 1;
dp[3] = 1;
for(int i=0;i<t;i++)
{
int n = test[i];
for(int j =1;j<=n;j++)
{
if(j>3)
dp[j] = dp[j-2] + dp[j-3];
}
System.out.println(dp[n]);
}
}
}
'항해' 카테고리의 다른 글
[Day31]JAVA 백준 줄세우기(2631번) (0) | 2024.11.27 |
---|---|
[Day30]JAVA 백준 상자 넣기(1965번) (0) | 2024.11.26 |
[Day28]JAVA 백준 가장 큰 증가하는 부분 수열(11055번) (0) | 2024.11.24 |
[Day27]JAVA 백준 가장 긴 감소하는 부분 수열(11722번) (0) | 2024.11.23 |
[Day26]JAVA 백준 돌게임(9655번) (0) | 2024.11.22 |