ABOUT ME

오늘 공부해도 내일 까먹는 나를 위해 남겨 두는 공부 히스토리

Today
Yesterday
Total
  • 피보나치 수열
    Study/알고리즘 2019. 2. 17. 20:49

    면접 중 손코딩 단골 피보나치 수열


    피보나치 수열은 

    a1=1,  a2=1,  an+2=an+1+an  (n=1, 2, 3, ) 라는 규칙을 갖는다.


    1 1 2 3 5 8 13 21 34 55 …


    이 수열을 재귀, 메모이제이션, 반복문으로 나타내보자



    피보나치 수열을 푸는 방법 1 - 재귀


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int input = 8;
    for (int i = 1; i <= input; i++) {
    System.out.println(fibo(i));
    }
    }
    public static int fibo(int n) {
    if (n <=2) {
    return 1;
    }
    else
    return fibo(n - 1) + fibo(n - 2);
    }
    }

    근데 이건.. 시간 복잡도가 O(2^N) .. 느려 느려



    피보나치 수열을 푸는 방법 2 - 메모이제이션 (memoization)


    static int[] f;
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    int input = sc.nextInt();
    f = new int[input+1];
    Arrays.fill(f, 0);
    System.out.println(fibo(input));
    }
    public static int fibo(int n){
    if (n <= 2)
    return 1;
    else if (f[n] != 0) // 이미 계산이 되어 배열에 가지고 있음
    return f[n];
    else
    return f[n] = fibo(n - 1) + fibo(n - 2);
    }


    이건 시간 복잡도가 O(N) 이라서 훨씬 빠르다.




    피보나치 수열을 푸는 방법 3 - 반복문



    public static void main(String[] args) {
    int input = 8;
    f = new int[input + 1];
    f[0] = 0;
    f[1] = 1;
    for (int i = 2; i <= input; i++) {
    f[i] = f[i - 1] + f[i - 2];
    }
    System.out.println(f[input]);
    }

    얘도 시간 복잡도가 O(N)  이다!


    이제 이 기본 코드에서 조건을 더해서 응용으로 문제가 나오겠지?







    'Study > 알고리즘' 카테고리의 다른 글

    에라토스테네스의 체 ( 소수 판별)  (0) 2019.02.22
    스택 구현하기 (Stack)  (0) 2019.02.21
    퀵소트 (Quick Sort)  (0) 2019.02.19
Designed by Tistory.