본문 바로가기
Baekjoon/[3] DP

[백준] 1003번 피보나치 함수 JAVA (자바) 풀이

by Poorm 푸름 2024. 6. 29.

문제 1003번 (DP)

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

 

  • fibonacci(3) = fibonacci(2)와 fibonacci(1) 
  • fibonacci(2) = fibonacci(1)과 fibonacci(0)
 
 

 

 

[입력]


 :  
첫째 줄에 테스트 케이스의 개수 T

    각 테스트 케이스에 N이 주어진다 ( N은 40보다 작거나 같은 자연수 또는 0)

 

 

[출력]


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



[설명]

 

DP 알고리즘

: 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하지 않음으로서 수행 시간 단축시키는 방법

  DP 구현 방법은 일반적으로 Top-down(하향식)과 Bottom-up(상향식)으로 구성된다

 

탑다운 (Top-Down)  보텀업 (Bottom-Up)
작은 크기로 문제를 나눠서 해결 작은 것부터 해결해서 점차 빌드업
메모제이션 (memoization) 타뷸레이션 (tabulation)
일부만 계산해도 답이 나올 때 모두 계산해야 답이 나올 때
재귀 반복문
시간 복잡도 O(n) 시간 복잡도 O(n)

 

 

 [코드]

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        int dp[][] = new int[41][2];
        
        dp[0][0] = 1;
        dp[0][1] = 0;
        dp[1][0] = 0;
        dp[1][1] = 1;
            
        while(T-->0){
            int N = Integer.parseInt(br.readLine());
            for(int i=2; i<=N; i++){
                dp[i][0]=dp[i-1][0]+dp[i-2][0];
                dp[i][1]=dp[i-1][1]+dp[i-2][1];
            }
            System.out.println(dp[N][0]+" "+dp[N][1]);
        }
    }
}

 

 

 [해설]
     

 :  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int T = Integer.parseInt(br.readLine());
    int dp[][] = new int[41][2];
        
 :  dp[0][0] = 1;  0을 선택했을 때 0의 개수
    dp[0][1] = 0;  0을 선택했을 때 1의 개수
    dp[1][0] = 0;  1을 선택했을 때 0의 개수
    dp[1][1] = 1;  1을 선택했을 때 1의 개수
            
 :  while(T-->0){  테스트 케이스만큼 반복
            int N = Integer.parseInt(br.readLine());  N입력
            for(int i=2; i<=N; i++){  2부터 시작하기
                dp[i][0]=dp[i-1][0]+dp[i-2][0];  
                dp[i][1]=dp[i-1][1]+dp[i-2][1];
            }
            System.out.println(dp[N][0]+" "+dp[N][1]);  0개수 1개수 출력
    }
    

    

 

 

 

 

이제 풀어보러 갈께요 :)

 

 

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

 

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *