본문 바로가기
알고리즘/백준(JAVA)

[백준] 1003번: 피보나치 함수 [JAVA-자바]

by 콘텐츠박스 2021. 1. 12.
반응형

문제

www.acmicpc.net/problem/1003

 

1003번: 피보나치 함수

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

Problem

  • 0.25초라는 시간 제한이 있기 때문에 시간을 신경써야 하는 문제
  • 문제 그대로 단순하게 구현하면 무조건 시간 초과가 발생한다.
  • 연상량을 줄이기 위해서는 메모제이션을 써야 한다.

 

메모제이션을 안쓰면

시간복잡도 O(2^N)

메모제이션을 쓰면

시간복잡도 O(N) 

Solution

  • DP를 이용해서 문제를 해결한다.
  • 피보나치 값이 0과 1일때는 바로 "1 0", "0 1" 로 출력한다.
  • dp[][] 배열을 만들어서 0과 1을 따로 카운트 한다.
  • 현재값은 전의값과 전전값이 합쳐진 값이기 때문에 아래와 같은 방정식이 나오게 된다.
  • dp[N] = dp[N-1] + dp[N-2]

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static Integer[][] dp = new Integer[41][2];

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		dp[0][0] = 1;  
		dp[0][1] = 0;
		dp[1][0] = 0;
		dp[1][1] = 1;

		int tc = Integer.parseInt(br.readLine());

		for (int i = 0; i < tc; i++) {
			int N = Integer.parseInt(br.readLine());
			fibonacci(N);
			sb.append(dp[N][0] + " " + dp[N][1] + '\n');
		}

		System.out.println(sb);

	}

	static Integer[] fibonacci(int N) {

		if (dp[N][0] == null || dp[N][1] == null) {

			dp[N][0] = fibonacci(N - 1)[0] + fibonacci(N - 2)[0];
			dp[N][1] = fibonacci(N - 1)[1] + fibonacci(N - 2)[1];
		}

		return dp[N];
	}
}

 

댓글