Maximum Non Negative Product in a Matrix
문제 내용 : (0,0)에서 최소 거리 기준으로 (우측, 아래로만 이동 가능) 이동하면서 (row,col)까지의, Path의 값들을 곱한다고 했을 때 최대 값은 얼마인가? 음수로만 최대 값이 나온다면 -1을 return 한다.
접근 방법 : Dynamic-Programming-With-Comments (문제 해결 못해서 Contest 후 Comment를 보고 풀이 했다. 그래서 코드도 똑같다.)
가장 큰 값들로만 이루어진 Maximum Grid와
가장 작은 값들로 이루어진 Minimum Grid를 유지하고 최종적으로 Maximum Grid의 (row, col) 값으로 return하면 된다.
- 현재 값이 0보다 작은 경우
- 가장 큰 값 : 좌측 그리고 상단 Cell에서 가장 작은 값을 곱하면 가장 큰 값이 된다.
예) 좌측 5, 상단 -6라고 볼때 현재 값이 -1이면 -6 * -1이 가장 큰 값이 된다.
예2) 좌측 9, 상단 1라고 볼때 현재 값이 -1이면 1 * -1이 가장 큰 값이 된다. - 가장 작은 값 : 좌측 그리고 상단 Cell에서 가장 큰 값을 곱하면 가장 작은 값이 된다.
예) 좌측 5, 상단 -6라고 볼때 현재 값이 -1이면 5 * -1이 가장 작은 값이 된다.
예2) 좌측 9, 상단 1라고 볼때 현재 값이 -1이면 9 * -1이 가장 작은 값이 된다.
- 가장 큰 값 : 좌측 그리고 상단 Cell에서 가장 작은 값을 곱하면 가장 큰 값이 된다.
- 현재 값이 1보다 큰 경우
- 가장 큰 값 : 좌측 그리고 상단 Cell에서 가장 큰은 값을 곱하면 가장 큰 값이 된다.
예) 좌측 5, 상단 -6라고 볼때 현재 값이 1이면 5 * 1이 가장 큰 값이 된다.
예2) 좌측 9, 상단 1라고 볼때 현재 값이 1이면 9 * 1이 가장 큰 값이 된다. - 가장 작은 값 : 좌측 그리고 상단 Cell에서 가장 작은 값을 곱하면 가장 작은 값이 된다.
예) 좌측 5, 상단 -6라고 볼때 현재 값이 1이면 -6 * 1이 가장 작은 값이 된다.
예2) 좌측 9, 상단 1라고 볼때 현재 값이 1이면 1 * 1이 가장 작은 값이 된다.
- 가장 큰 값 : 좌측 그리고 상단 Cell에서 가장 큰은 값을 곱하면 가장 큰 값이 된다.
var maxProductPath = function(grid) {
let poArr = new Array(grid.length).fill(0).map(_ => new Array(grid[0].length).fill(0));
let neArr = new Array(grid.length).fill(0).map(_ => new Array(grid[0].length).fill(0));
for (let i = 0; i < grid.length; i++) {
poArr[i][0] = grid[i][0] * (0 < i ? poArr[i - 1][0] : 1);
neArr[i][0] = grid[i][0] * (0 < i ? neArr[i - 1][0] : 1);
}
for (let i = 0; i < grid[0].length; i++) {
poArr[0][i] = grid[0][i] * (0 < i ? poArr[0][i - 1] : 1);
neArr[0][i] = grid[0][i] * (0 < i ? neArr[0][i - 1] : 1);
}
for (let row = 1; row < grid.length; row++) {
for (let col = 1; col < grid[0].length; col++) {
if (grid[row][col] < 0) {
// 마이너스는 가장 작은 값과 곱해지는 것이 최고 값이 된다.
poArr[row][col] = Math.min(neArr[row - 1][col], neArr[row][col - 1]) * grid[row][col];
// 마이너스에 가장 큰값을 곱하면 가장 작은 값이 된다.
neArr[row][col] = Math.max(poArr[row - 1][col], poArr[row][col - 1]) * grid[row][col];
} else {
// 양수는 가장 큰 값과 곱해지는 것이 최고 값이 된다
poArr[row][col] = Math.max(poArr[row - 1][col], poArr[row][col - 1]) * grid[row][col];
// 양수는 가장 작은 값과 곱해지는 것이 최저가가 된다.
neArr[row][col] = Math.min(neArr[row - 1][col], neArr[row][col - 1]) * grid[row][col];
}
}
}
return 0 <= poArr[grid.length-1][grid[0].length-1] ? poArr[grid.length-1][grid[0].length-1] % (Math.pow(10,9) + 7) : -1;
};
728x90
반응형
'Problem Solving' 카테고리의 다른 글
Gas Station (0) | 2020.09.24 |
---|---|
Minimum Cost to Connect Two Groups of Points (0) | 2020.09.23 |
Split a String Into the Max Number of Unique Substrings (0) | 2020.09.20 |
Rearrange Spaces Between Words (0) | 2020.09.20 |
Sequential Digits (0) | 2020.09.19 |