프로그래머스 - 멀리 뛰기
class Solution {
public long solution(int n) {
long[] arr = new long[2001];
arr[1] = 1;
arr[2] = 2;
for(int i = 3; i <=n; i++) {
arr[i] = (arr[i-2] % 1234567) + (arr[i-1] % 1234567);
}
return arr[n] % 1234567;
}
}
- 이게 왜 피보나치?
- 피보나치가 아닌 우연의 일치
- n번째 칸에 도달하는 경우는 아래 2가지 뿐
- n-2번째 칸에서 2칸 점프
- n-1번째 칸에서 1칸 점프
- 따라서 f(n) = f(n-1) 1 + f(n-2) 1의 식을 얻음
- 1을 곱한 것은 n-2에서 2칸 이동하는 것은 1가지 뿐
- n-1에서 1칸 이동하는 것은 1가지 뿐
- 2칸과 1칸을 이동하는 것은 독립적이기에 더함
- 이전 틀린 코드 : dfs로 풀었었는데, 많이 실패함 ㅎㅎ..
class Solution {
int count = 0;
public long solution(int n) {
if(n==1) return 1;
dfs(n, 0);
return count;
}
public void dfs(int target, int cur) {
if(cur > target)
return;
else if(cur == target)
count++;
else {
dfs(target, cur + 1);
dfs(target, cur + 2);
}
}
}