알고리즘 공부/문제 풀이
[프로그래머스] 동적계획법 - 등굣길
valid_ming
2020. 8. 24. 13:35
풀이방법
1. 중학교 때인가 배웠던 것처럼 숫자를 합하는 방식으로 진행한다.
| 1 | 1 | 1 | |
| 1 | 2 | 3 | 4 |
| 1 | 3 | 6 | 10 |
2. 갈 수 없는 곳은 -1, [m][0],[0][n] 에는 1로 초기화한다. (나머지는 자동 0 초기화)
| 1 | 1 | 1 | |
| 1 | -1 | 0 | 0 |
| 1 | 0 | 0 | 0 |
3. 만약 [m][0],[0][n]에서 -1값이 있다면 그 다음 칸들은 절대 갈 수 없다 ((0,2)가 -1인 경우 (0,3)도 -1이 될 수밖에 없음)
| 1 | -1 | -1 | |
| 1 | -1 | 0 | 0 |
| 1 | 0 | 0 | 0 |
4. 0인 칸들을 계산한다
map[i][j]=map[i-1][j]+map[i][j-1]
5. -1인 칸은 0으로 바꿔준뒤 다음 칸으로 넘어간다.
static int solution(int m, int n, int[][] puddles) {
int[][] map=new int[m][n];
for(int i=1;i<m;i++) map[i][0]=1;
for(int j=1;j<n;j++) map[0][j]=1;
//물에 잠긴 곳은 -1
for(int k=0;k<puddles.length;k++) {
int i=puddles[k][0]-1;
int j=puddles[k][1]-1;
map[i][j]=-1;
if(i==0) {
for(int x=j;x<n;x++) map[0][x]=0;
}
if(j==0) {
for(int x=i;x<m;x++) map[x][0]=0;
}
}
for(int i=1;i<m;i++) {
for(int j=1;j<n;j++) {
if(map[i][j]==-1) {
map[i][j]=0;
continue;
}
map[i][j]=map([i-1][j]+map[i][j-1])%1000000007;
}
}
return map[m-1][n-1];
}
정확도 문제는 모두 맞았지만 효율성 문제가 계속 오답이 나서
서칭해보니 계산 중간에 오버플로우가 난 것이 원인이라고 하여
map[i][j]=map[i-1][j]+map[i][j-1]%1000000007;
이렇게 수정해 주었더니 효율성 문제까지 모두 맞혔다