코딩 테스트/백준

[백준] 10870번 : 피보나치 수 5(JAVA / 자바)

토자맨 2023. 3. 25. 11:01

1. 배열을 이용한 풀이

if 조건분 부분 없이 else 부분만 적고 제출했더니 계속 런타임 에러 (ArrayIndexOutOfBounds)가 나서 한참을 헤맸다.

문제를 다시 한번 읽어보니 문제 조건에 cnt가 0~20이라고 조건을 줬고 0일 경우 else 부분의 for 조건문에 cnt-1이 불가능하기 때문에 조건을 추가해줘야 하는 것이었다.

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int cnt = sc.nextInt();
        if (cnt == 0){
            System.out.println(0);
        }
        else {
            int[] fn = new int[cnt+1];
            fn[0] = 0;
            fn[1] = 1;
            
            for (int i = 0; i < cnt-1; i++) {
                fn[i+2] = fn[i] + fn[i+1];
            }
            System.out.println(fn[cnt]);
        }
    }
}

좀 더 깔끔한 풀이

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int cnt = sc.nextInt();

        int[] fn = new int[cnt+1];
            
        for (int i = 0; i < cnt + 1; i++) {
            if(i==0) fn[i] = 0;
            else if (i == 1) fn[i] = 1;
            else fn[i] = fn[i-1] + fn[i-2];
        }
        System.out.println(fn[cnt]);
    }
}

2. 재귀를 이용한 풀이

나는 재귀는 생각도 못하고 배열로만 풀었는데 다른 사람들의 풀이를 보고 기억이 났다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int cnt = sc.nextInt();
        System.out.println(fibonacci(cnt));
    }
    static int fibonacci(int n)
    {
        if (n==0) return 0;
        if (n==1) return 1;
        else return fibonacci(n-1) + fibonacci(n-2);
    }
}