You are given an m x n integer array grid. There is a robot initially located at the top-left corner (i.e., grid[0][0]). The robot tries to move to the bottom-right corner (i.e., grid[m-1][n-1]). The robot can only move either down or right at any point in time.
An obstacle and space are marked as 1 or 0 respectively in grid. A path that the robot takes cannot include any square that is an obstacle.
Return the number of possible unique paths that the robot can take to reach the bottom-right corner.
The testcases are generated so that the answer will be less than or equal to 2 * 109.
Example 1:
Input: obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
Output: 2
Explanation: There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right
Example 2:
Input: obstacleGrid = [[0,1],[0,0]]
Output: 1
Constraints:
- m == obstacleGrid.length
- n == obstacleGrid[i].length
- 1 <= m, n <= 100
- obstacleGrid[i][j] is 0 or 1.
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] arr = new int[m][n];
// 로봇이 갈 수 있는 어디던지 obstacle 가능이기 때문에 [0][0]에도 있을 수 있음.
// 무조건 로봇이 갈 수 있다고 하면 안됨. ([[1]])
arr[0][0] = 1-obstacleGrid[0][0];
for(int i=0; i<m; i++){
if(obstacleGrid[i][0] == 1){
break;
}
arr[i][0] = 1;
}
for(int i=0; i<n; i++){
if(obstacleGrid[0][i] == 1){
break;
}
arr[0][i] = 1;
}
// for(int i=0; i<m; i++){
// for(int j=0; j<n; j++){
// System.out.print(arr[i][j]+" ");
// }
// System.out.println();
// }
// System.out.println();
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
if(obstacleGrid[i][j] == 1){
arr[i][j] = 0;
continue;
}
arr[i][j] = arr[i-1][j]+arr[i][j-1];
}
}
return arr[m-1][n-1];
}
}
문제를 읽어봤을 때 상식적으로 [0, 0]에는 장애물이 없을 것처럼 생각이 되는데.. 그게 아니어서 조금 시간이 걸렸다.
별로 썩,, 좋은 문제는 아니었던 것 같다.