dq
로 푸는 문제. 효율성에서 삑나는게 왜인가 했는데 더할 때마다 나머지 해주면 안됨...ㅋ
더해놓고 1000000007
이 넘으면 나머지 계산해줘야 한다.
v[0][0]
은 1
이고, 웅덩이가 있는 곳은 -1
로 초기화 해준다.v[i][j]
가 웅덩이면 continuev[i][j]
의 위쪽까지 오는 경우의 수와 왼쪽까지 오는 경우의 수를 더해준다. (범위 내일 경우만)v[i][j] = v[i-1][j] + v[i][j-1]
1000000007
이 넘는다면 나머지 값을 넣어준다.answer
값은 v[n-1][m-1]
이 된다.#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int m, int n, vector<vector<int>> puddles) {
int answer = 0;
vector<vector<int>> v(n, vector<int>(m));
v[0][0] = 1;
for (int i = 0;i < puddles.size();i++)
{
v[puddles[i][1] - 1][puddles[i][0] - 1] = -1;
}
for (int i = 0;i < n;i++)
{
for (int j = 0;j < m;j++)
{
if (v[i][j] == -1) continue;
if (i - 1 >= 0 && v[i - 1][j] != -1) // 위에 칸이 있을 때
v[i][j] += v[i - 1][j];
if (j - 1 >= 0 && v[i][j-1] != -1) // 왼쪽에 칸이 있을 때
v[i][j] += v[i][j - 1];
if(v[i][j]>=1000000007) v[i][j]%=1000000007;
}
}
answer = v[n - 1][m - 1];
return answer;
}