알고리즘/백준 알고리즘
[java] 백준 알고리즘 9461번 파도반 수열 풀이
희랍인 조르바
2018. 7. 21. 16:41
다이나믹 프로그래밍 문제라는 것을 감안하고 시작!
이 문제는 종이에 몇 번 끄적이다보면 규칙을 찾을 수 있다.
P(10) 정도까지 만들어보겠다.
P(5)까지는 규칙이 안 보여서 직접 대입했다.
해당 값(파도반 수열 P(?))이 나오는데 어떤 순서의 값들이 더해진걸까를 찾아봤다.
6번째부터는 바로 현재 삼각형의 한 변과 4번째 전에 그려진 삼각형의 한 변을 더 한 길이가
다음 삼각형의 한 변 길이가 됐다.
그럼 현재의 삼각형 길이를 구하기 위해서는
P(i) = P(i-1) + P(i-5)라는 식이 적용할 수 있지 않을까?
앞에서 말했듯이 5번째까지는 규칙이 안 보였으니 6번부터 바로 시작하겠다.
P(6) == P(5) + P(1) --> 3 == 2 + 1
P(7) == P(6) + P(2) --> 4 == 3 + 1
P(8) == P(7) + P(3) --> 5 == 4 + 1
P(9) == P(8) + P(4) --> 7 == 5 + 2
P(10) == P(9) + P(5) -> 9 == 7 + 2
P() 식 안에 대입할 숫자의 범위도 크지 않으니
미리 만들어 놓고 입력되는대로 바로 출력하면 되겠다.
* 풀이 소스
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 30 31 32 | public class Baekjoon9461 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); StringBuilder sb = new StringBuilder(); long[] padobanSeq = new long[101]; // 파도반 수열 padobanSeq[1] = 1; padobanSeq[2] = 1; padobanSeq[3] = 1; padobanSeq[4] = 2; padobanSeq[5] = 2; for(int i=6; i<padobanSeq.length; i++) { // 6번째부터 규칙이 성립 padobanSeq[i] = padobanSeq[i-1] + padobanSeq[i-5]; } int testCase = Integer.parseInt(st.nextToken()); for(int j=0; j<testCase; j++) { st = new StringTokenizer(br.readLine()); sb.append(padobanSeq[Integer.parseInt(st.nextToken())]+"\n"); } bw.write(sb.toString()); bw.flush(); } } | cs |