본문 바로가기

머리맞대는이야기/백준

[2747] 피보나치 수

반응형

출처 : www.acmicpc.net/problem/2747

 

2747번: 피보나치 수

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된��

www.acmicpc.net

풀이과정

1. 재귀함수를 이용하여 구현한다.

 


작성코드

import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		bw.write(String.valueOf(func(n)));
		br.close();
		bw.flush();
		bw.close();
	} // main

	private static int func(int cal) throws IOException {
		if (cal == 0)
			return 0;
		else if (cal == 1)
			return 1;
		else
			return func(cal - 1) + func(cal - 2);
	} // func

} // MainNew

 

참고코드

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		int a = 0;
		int b = 1;
		while (n > 0) {
			int temp = a;
			a = b;
			b = temp + b;
			n--;
		}
		
		System.out.println(a);
	}

}

 

memo

bufferdwriter 사용시 int는 string 변환 출력해야 된다는 것을 알았다.

작성코드는 값은 나오지만 시간 초과로 통과하지 못했다.

재귀 구현 연습용 문제였다.

 

+

피보나치 수, 점화식 같은 문제는 재귀로 구현은 가능하지만 연산 시간이 굉장히 많이 걸린다.

예를 들면, func(4) 를 호출 하였을때 func(1) 함수는 그 과정에서 다섯번 호출된다.

호출되는 함수를 트리 형태로 그려보면 알 수 있다.

그래서 내가 작성한 재귀 함수의 연산속도는 2의 n제곱이 되면서

문제에서 말한 최대 n이 45가 된다면

2의 45제곱은 연산하기에는 너무 큰 수라서 시간초과 발생할 수 밖에 없던 코드 였음, 재귀가 아닌 단순 반복문으로 푸는게 맞음

 

반응형

'머리맞대는이야기 > 백준' 카테고리의 다른 글

[7490] 0 만들기  (0) 2020.10.04
[1074] Z  (0) 2020.10.04
[1939] 중량제한  (0) 2020.09.30
[1991] 트리순회  (0) 2020.09.30
[17269] 이름궁합 테스트  (0) 2020.09.29