https://programmers.co.kr/learn/courses/30/lessons/12914
n
이 주어지면 갈 수 있는 방법을 1234567로 나눈 나머지를 return 하는 문제이다.전형적인 dp 문제이다. 또 1234567로 나눈 나머지를 return 하라는 것으로 봐서 dp 문제가 확실하다.
점화식을 세우는데 1칸과 2칸을 갈 수 있는 것으로 봐서 k
는 k-1
과 k-2
의 식으로 나타내어진다.
k-2
에서 2칸을 가는데 2칸을 갈 수 있는 방번은 1칸-1칸, 2칸이 있다.
k-1
에서 1칸을 가는데 방법은 1칸 한가지 밖에 없다.
그런데 k-2
에서 1칸-1칸을 가는것이 k-1
에서 1칸을 가는것과 방법이 겹친다.
따라서 dp[k] = dp[k-1] + 2*dp[k-2] - dp[k-2]
= dp[k] = dp[k-1] + dp[k-2]
라는 간단한 점화식이 나온다.
1234567로 나눈 나머지만 조심해서 코딩하면 어렵지 않다.
#include <string>
#include <vector>
using namespace std;
long long dp [2001];
long long f(int n){
if(dp[n]!=0){
return dp[n];
}
dp[n] = (f(n-1)+f(n-2))%1234567;
return dp[n];
}
long long solution(int n) {
long long answer = 0;
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
answer = f(n);
return answer;
}