반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/12945
문제 조건
문제 설명
피보나치 수는 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 이하인 자연수입니다.
입출력 예
n return
3 | 2 |
5 | 5 |
입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.
풀이 1 (실패)
피보나치수? 그냥 0일때 0, 1일때 1, 2이상일때 n-1, n-2를 더하면 되는거아닌가? 라고 간단하게 생각하였습니다.
문제조건에 n번째 피보나치수를 1234567로 나눈 나머지를 리턴하라고 되어 있어 2 이상일 때만 1234567로 나누었습니다.
작성코드 1 (실패)
class Solution {
public int solution(int n) {
int ans=0;
if(n==0){
ans=0;
} else if (n==1) {
ans=1;
} else {
ans = (solution(n-2)+solution(n-1))%1234567;
}
return ans;
}
}
시간초과로 실패하였습니다
풀이 2 (성공)
계산을 할 때마다, solution이 계속 도는 재귀함수의 형태가 시간초과의 문제인 것 같아,
solution이 반환하는 값을 int 배열에 넣기로 결정하였다.
작성코드 2 (성공)
class Solution {
public int solution(int n) {
int ans=0;
int[] arr=new int[n+1];
for(int i=0;i<=n;i++){
if(i==0){
arr[i]=0;
}else if(i==1){
arr[i]=1;
}else{
arr[i]=(arr[i-1]+arr[i-2])%1234567;
}
}
return arr[n];
}
}
solution을 계속 도는 재귀형식은 숫자가 클수록 제곱의 형태로 점점 계산수가 많아지므로, 배열에 값을 저장하여 진행하였더니 통과했다.
반응형