https://www.acmicpc.net/problem/9461
파도반 수열 성공
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 16843 | 6645 | 5441 | 37.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 |
'알고리즘 문제 (백준저지) > DP' 카테고리의 다른 글
[백준/11052] 카드 구매하기 (Java/코드) (0) | 2019.02.06 |
---|---|
[백준/2225] 합분해 (Java/코드) (0) | 2019.02.06 |
[백준/1699] 제곱수의 합 (Java/코드) (0) | 2019.02.04 |
[백준/2579] 계단 오르기 (Java/코드) (0) | 2019.02.04 |
[백준/1912] 연속합 (Java/코드) (0) | 2019.02.04 |