나의 풀이
class Solution {
public int solution(int n) {
int answer = 0;
int[] fibo = new int[n + 1];
fibo[0]=0;
fibo[1]=1;
System.out.println("fibo.length = " + fibo.length);
for (int i = 2; i < fibo.length; i++) {
int sum=fibo[i-1]+fibo[i-2];
fibo[i]=sum % 1234567;
}
return fibo[fibo.length-1] % 1234567;
}
}
🚨이런 문제가 있어요
n이 매우 큰 경우 n번째 피보나치 수는 언어가 표현할 수 있는 자료형의 범위를 넘어가, 오버플로우가 납니다.
예를 들어
47번째 피보나치 수는 2,971,215,073이고, 이 수는 32비트 정수(ex. int) 범위를 넘어 오버플로우가 발생합니다.
100,000번째 피보나치 수는 자릿수가 20,000을 넘어가며, 이는 64비트 정수(ex. long) 범위를 넘어 오버플로우가 발생합니다.
💡그럼 코드를 어떻게 바꾸면 좋나요?
모든 단계에서 % 연산을 사용하여, 모든 연산에서 오버플로우가 일어나지 않게 만들어 주세요.
▶오버플로우 고려하기 전 : fibo[i] =fibo[i-1]+fibo[i-2];
▶오버플로우 고려 후 int sum=fibo[i-1]+fibo[i-2];
fibo[i] =sum % 123457
'프로그래머스(자바) > LV.2(자바)' 카테고리의 다른 글
카펫→ 리스트 배열넣기, 리스트 출력★★ (0) | 2022.12.24 |
---|---|
다음 큰 숫자→'문자열'에서 특정 요소 개수 세기(replace)★★ (0) | 2022.12.24 |
이진 변환 반복하기 → 특정 요소 개수 replace() 이용★★★ + 10진수→2진수★ (0) | 2022.12.23 |
올바른 괄호 →예외★★ + count로 접근 (0) | 2022.12.23 |
최솟값 만들기 → 동일 for문 안에서 서로 반대로 곱하기★★ (0) | 2022.12.23 |