코딩테스트
[못풀었다/릿코드]2328. Number of Increasing Paths in a Grid
_서리__
2023. 6. 18. 21:14
var countPaths = function(grid) {
//increasing
//일단 셀별로 하나씩
//두개.. 세개 네개.. 나아가는 것이 좋겠음.
//adjacent 즉 인접한 곳만 갈 수 있음.
//인접한 곳으로 가면서, 4방향중에 증가된 곳은 가고 증가되지 않은 곳은 안갈것.
//가면 일단 간것으로 1추가하고, 그 다음으로 갈 수 있는지 확인해서 또 1추가.
//일단 전체를 한바퀴 돌아야함.
const MOD = 1e9 + 7;
const dx = [1,-1,0,0];
const dy = [0,0,1,-1];
const m = grid.length;
const n = grid[0].length;
let answer = 0;
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
let startCellIdx = [i,j]
let queue = [startCellIdx];
while(queue.length){
(answer++)%MOD
let [y,x] = queue.shift();
for(let k=0;k<4;k++){
let nextX = x+dx[k]
let nextY = y+dy[k]
if(nextX>=0&&nextX<n&&nextY>=0&&nextY<m&&grid[nextY][nextX]>grid[y][x]){
queue.push([nextY,nextX])
}
}
}
}
}
return (answer)%MOD
};
처음 풀었던 풀이. 안풀리는 것은 아니었으나 시간복잡도에서 막혔음.
var countPaths = function(grid) {
let mod = Math.pow(10, 9) + 7;
let result = 0;
let rows = grid.length, columns = grid[0].length;
let dp = Array(rows).fill(null).map(_ => Array(columns).fill(0));
const dfs = (r, c, preVal)=> {
if (r < 0 || r == rows || c < 0 || c == columns || grid[r][c] <= preVal) return 0
if (dp[r][c]) return dp[r][c]
return dp[r][c] = (1 + dfs(r + 1, c, grid[r][c]) +
dfs(r - 1, c, grid[r][c]) +
dfs(r , c + 1, grid[r][c]) +
dfs(r , c - 1, grid[r][c])) % mod;
}
for(let i = 0; i < rows; i++) {
for(let j = 0; j < columns; j++) {
result += dfs(i, j, -1) % mod;
}
}
return result % mod;
};
이후 dp를 이용한 풀이. dp를 잘 이용해야한다...