728x90
반응형
SMALL
📌 문제 정보
- 출처: 문제 링크
- 난이도: ⭐
- 문제 유형: DP
- 사용 언어: Java
🔍 문제 설명
피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어
- F(2) = F(0) + F(1) = 0 + 1 = 1
- F(3) = F(1) + F(2) = 1 + 1 = 2
- F(4) = F(2) + F(3) = 1 + 2 = 3
- F(5) = F(3) + F(4) = 2 + 3 = 5
와 같이 이어집니다.
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.
제한사항
- n은 2 이상 100,000 이하인 자연수입니다.
💡 풀이 노트
- 피보나치 수열은 f(n) = f(n-1) + f(n-2)의 점화식을 가짐
- 하지만 단순 재귀로 구현하면 중복 호출이 너무 많아 성능이 떨어짐
- 그래서 반복문 + 배열 저장 방식으로 개선
- 또한, 큰 수 연산을 방지하기 위해 문제에서 요구한 1234567로 나머지 연산을 적용
입력: n = 5
결과: 5
→ 피보나치 수열: 0, 1, 1, 2, 3, 5
🚀 코드 (Java)
class Solution {
public int solution(int n) {
return fibo(n);
}
public int fibo(int n){
if(n == 0) return 0;
if(n == 1) return 1;
int[] F = new int[n+1];
F[0] = 0;
F[1]= 1;
for(int i = 2; i <= n ; i++){
F[i] = (F[i-1] + F[i-2])%1234567;
}
return F[n];
}
}
🖥 실행 결과
입력 & 출력
n return
3 2
5 5
🔄 개선 가능성
- 배열 전체를 저장하지 않고 2개의 변수만으로도 계산 가능 → 메모리 절약 가능
public int solution(int n) {
if(n == 0) return 0;
if(n == 1) return 1;
int a = 0, b = 1;
for(int i = 2; i <= n; i++){
int temp = (a + b) % 1234567;
a = b;
b = temp;
}
return b;
}
📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest
728x90
반응형
LIST