1 분 소요

1. 문제

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

  • 재귀 함수 문제(재귀 함수의 한계)
// 문제
피보나치 수는 0 1 시작한다.
0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다.
 다음 2번째 부터는 바로   피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n  2) 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 , n번째 피보나치 수를 구하는 프로그램을 작성하시오.

// 입력
첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.

// 출력
첫째 줄에 n번째 피보나치 수를 출력한다.

// 예제 입력 1
10

// 예제 출력 1
55


2. 핵심 아이디어

  • 피보나치 수열의 점화식을 세움
  • 재귀 함수를 이용해 문제를 풀 수 있는지 검토
  • 문제에서 n은 최대 45
  • 재귀적으로 풀면 시간초과


3. Python 문제풀이

import sys

n = int(sys.stdin.readline())

a, b = 0, 1

while n > 0 :
  a, b = b, a + b
  n -= 1

print(a)


4. Java 문제풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    int n = Integer.parseInt(st.nextToken());

    long[] fibo = new long[n + 1];

    fibo[0] = 0;
    fibo[1] = 1;

    for (int i=2; i<=n; i++) {
      fibo[i] = fibo[i - 1] + fibo[i - 2];
    }

    System.out.println(fibo[n]);
  }
}

댓글남기기