[백준] #2748 피보나치 수 2 - JAVA

GAEUN·2025년 2월 10일

백준

목록 보기
1/14
post-thumbnail

❔ 문제

피보나치 수는 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은 90보다 작거나 같은 자연수이다.

출력

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

예제 입력1

10

예제 출력1

55

🔍 문제 풀이

이 문제는 피보나치 수를 구하는 문제이다.
n번째 피보나치 수를 출력해야 하며, n은 90보다 작거나 같은 수로, 최대 90까지 주어진다.
처음 문제를 보고 피보나치 수열 Fn = Fn-1 + Fn-2 (n ≥ 2) 점화식을 동적 계획법(DP) 방식으로 접근했다.
피보나치 수열은 이전 두 항의 합으로 구할 수 있으므로
배열을 이용해서 arr[i] = arr[i-2] + arr[i-1] 형태로 값을 누적해야겠다고 생각했다.

❌ 첫 번째 제출(오답)

import java.io.*;

public class Main{

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		
		// n=0과 n=1은 미리 처리
        if(n==0) {
			System.out.println(0);
			return;
		} else if(n==1) {
			System.out.println(1);
			return;
		}
		int[] arr = new int[n+1];
		arr[0] = 0;
		arr[1] = 1;
		for(int i = 2; i <= n; i++) {
			arr[i] = arr[i-2] + arr[i-1];
		}
		
		System.out.println(arr[n]);
		
	}

}

위 코드의 문제점

  • int 타입 범위 초과
    - n = 90일 때 피보나치 값 = 2,880,067,194,370,816,120
    - int 최대값 = 2,147,483,647
    ➡️ long 타입으로 적용해야함

☑️ 최종 코드

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		br.close();
		
		if (n == 0) {
            System.out.println(0);
            return;
		}
		
		long[] arr = new long[n+1];
		arr[0] = 0;
		arr[1] = 1;
		for(int i = 2; i <= n; i++) {
			arr[i] = arr[i-2] + arr[i-1];
		}
		
		System.out.println(arr[n]);
		
	}
}

0개의 댓글