본문 바로가기
알고리즘 문제 (백준저지)/DP

[백준/9461] 파도반 수열 (Java/코드)

by 유헤 2019. 2. 6.


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




시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB168436645544137.998%

문제

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




이 문제는 많이 어렵지는 않다.

규칙을 계속 생각해보면

1 1 1 2 2 3 4 5 7 9

결국 기존에 있는 변의 길이 두개를 합해서 만들어지는것

예를 들면 d[1]=1 + d[5]=2 => d[6]=3

d[2]=1 + d[6]=3=> d[7]=4

라는 규칙 d[n] = d[n-1] + d[n-5] 을 세울 수 있다.




문제는 int와 long의 범위이다.

처음에 계속 된 실패로, 무엇이 문제일까? 생각을 해보았는데

문제의 조건에 자연수는 1 =< n <=100 까지 가능하다는 범주에서 잘 생각해보아야한다.

d[n]은 결국 2*(n-a) 만큼의 값만큼 증가한다는 의미인데,


int의 범위는  0 ~ 2,147,483,647(16진수로 7FFFFFFF), 



실제로 n의 값을 78 과 79를 주어주면


위와 같이 결과가 나오는데, d[79] = d[78] 1828587033 + d[74] 593775046 = 2,422,362,079

int의 범위를 넘어선다. 그러므로 long으로 바꿔서 작성해야 한다.


https://www.acmicpc.net/board/view/15516



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.*;
public class Main{
 
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
         long[] d = new long[101];
         
        d[0]=0;
        d[1]=1;
        d[2]=1;
        d[3]=1;
        d[4]=2;
        d[5]=2;
            
        for(int i=6;i<=100;i++){
            d[i]=d[i-1]+d[i-5];
        }
 
        while(t-->0){
            int n = sc.nextInt();
            System.out.println(d[n]);
        }
    }
}
 
 
 
cs