백준 자바 1003 피보나치함수

김재동·2024년 7월 28일
0

문제

목록 보기
13/16


이번 문제는 점화식과 관련있었던 것 같다.
d[n] = d[n-1] + d[n-2]를 반복하면서 최종적으로
d[0]은 0, d[1] = 1 를 return한다.
0과 1을 호출한 횟수를 각각 구하는 문제이다.

미리 피보나치 메서드를 만들어 놓고,
n의 최대값인 40까지의 경우의 수를 미리 다 구해 놨다.
이후 n의 값에 맞게 각각 출력하는 느낌으로 구현했다.

package test13;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Ox13_Q2_1 {
	static int [] zeroArr, oneArr ;
	// 백준 1003 S3 
	public static void main(String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(br.readLine());
		zeroArr= new int [41]; // n의 최대가 40이므로 +1
		oneArr = new int [41];
		
		// n개의 테스트 케이스 실행
		for(int i =0; i<n; i++) { 
			int temp = Integer.parseInt(br.readLine());
			fibonacci(); // 모든 경우의 수 미리 계산
			// 해당 경우의 수 출력
			sb.append(zeroArr[temp] + " " + oneArr[temp] + "\n");			
		} // for fin
		
		System.out.println(sb.toString().trim());
	}
	// 모든 경우의 수 미리 구해두기
	public  static void fibonacci() {
		zeroArr[0] = 1;
		oneArr[0] = 0;
		zeroArr[1] = 0;
		oneArr[1] = 1;
		
		for(int i = 2; i<=40; i++) {
			zeroArr[i] = zeroArr[i-1] + zeroArr[i-2];
			oneArr[i] = oneArr[i-1] + oneArr[i-2];
		}
	}

}

0의 경우의 수는 zeroArr, 1의 경우의 수는 oneArr 배열에 계속 누적된다.
따라서, zeroArr은 zeroArr[0] = 1, zeroArr[1] = 0이고,
oneArr은 oneArr[0] = 0, oneArr[1] = 1을 지정해주고,
나머지는 문제 그대로 반복하여 해결해주었다.

굿

profile
성장중

0개의 댓글