코딩테스트/BOJ

[BOJ] 1003 피보나치 함수 - JAVA

5월._. 2022. 3. 8.
728x90

1. 문제

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

 

1003번: 피보나치 함수

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

www.acmicpc.net

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);
    }
}

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.


2. 풀이

2차원 배열

  • Fn = Fn-1+Fn-2이므로 0의 수, 1의 수 역시 그렇게 구하면 된다. 
  • 예를 들면 F3의 0 개수는 F2의 0 개수+F1의 0 개수이다.
import java.io.*;

public class BOJ_1003_피보나치함수 {
   static int[][] fib = new int[41][2];
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int T = Integer.parseInt(in.readLine());
      StringBuilder sb = new StringBuilder();

      fib[0][0] = 1;
      fib[1][1] = 1;

      while(--T>=0){
         int N = Integer.parseInt(in.readLine());
         fibonacci(N);
         sb.append(fib[N][0]).append(" ").append(fib[N][1]).append("\n");
      }
      System.out.print(sb);
   }

   private static void fibonacci(int n) {
      if(fib[n][0]!=0 || fib[n][1]!=0 || n<=1) return;

      fibonacci(n-1);
      fib[n][0] = fib[n-1][0]+fib[n-2][0];
      fib[n][1] = fib[n-1][1]+fib[n-2][1];
   }
}

 

1차원 배열

  • 처음에 위의 코드대로 쉽게 2차원배열로 풀었다가 다른 규칙을 발견하고 다시 푼 코드다. 
  • Fn의 0의 개수는 Fn-1, 1의 개수는 Fn임을 발견했다. 따라서 코드는 다음과 같다.
  • 대신 N==0일때는 N-1 인덱스에 접근할 수 없으므로 따로 경우를 빼주었다.
import java.io.*;

public class BOJ_1003_피보나치함수 {
   static int[] fib = new int[41];
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int T = Integer.parseInt(in.readLine());
      StringBuilder sb = new StringBuilder();

      fib[0] = 0;
      fib[1] = 1;

      while(--T>=0){
         int N = Integer.parseInt(in.readLine());

         if(N==0) {
            sb.append("1 0\n");
            continue;
         }

         fibonacci(N);
         sb.append(fib[N-1]).append(" ").append(fib[N]).append("\n");
      }
      System.out.print(sb);
   }

   private static void fibonacci(int n) {
      if(n<2 || fib[n]!=0) return;

      fibonacci(n-1);
      fib[n] = fib[n-1]+fib[n-2];
   }
}

 


3. 결과

가장 아래에 있는 코드는 2차원 배열을 사용한 코드다. 중간의 틀린 코드는 무시하고 맨 위의 코드는 1차원 배열을 사용한 코드다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1780 종이의 개수 - JAVA  (0) 2022.03.08
[BOJ] 2630 색종이 만들기 - JAVA  (0) 2022.03.08
[BOJ] 9184 신나는 함수 실행 - JAVA  (0) 2022.03.08
[BOJ] 1091 카드섞기 - JAVA  (0) 2022.02.27
[BOJ] 10158 개미 - JAVA  (0) 2022.02.27

댓글