문제
2D 그리드가 있고 각 셀이 벽 'W', 적 'E' 또는 빈 '0'(숫자 0)이라고 가정합니다. 단 하나의 폭탄으로 죽일 수 있는 최대 적을 반환하는 함수를 작성해야 합니다.
폭탄은 벽이 너무 강해서 파괴되지 않기 때문에 벽에 부딪힐 때까지 심은 지점에서 같은 행과 열에 있는 모든 적을 죽입니다.
우리는 또한 빈 셀에만 폭탄을 넣을 수 있다는 것을 명심해야 합니다. 예를 들어, 함수에 대한 입력이 -
인 경우const arr = [ ['0', 'E', '0', '0'], ['E', '0', 'W', 'E'], ['0', 'E', '0', '0'] ];
그러면 출력은 다음과 같아야 합니다. -
const output = 3;
출력 설명:
[1,1]에 폭탄을 설치하면 가장 높은 3명의 적을 죽입니다.
예시
이에 대한 코드는 -
const arr = [ ['0', 'E', '0', '0'], ['E', '0', 'W', 'E'], ['0', 'E', '0', '0'] ]; const killEnemy = (arr = []) => { let m = arr.length; let n = m > 0 ? arr[0].length : 0; let result = 0, rows = 0; const cols = []; for (let i = 0; i < m; ++i) { for (let j = 0; j < n; ++j) { if (j === 0 || arr[i][j-1] === 'W') { rows = 0; for (let k = j; k < n && arr[i][k] != 'W'; ++k) if (arr[i][k] === 'E') rows += 1; } if (i === 0 || arr[i-1][j] === 'W') { cols[j] = 0; for (let k = i; k < m && arr[k][j] != 'W'; ++k) if (arr[k][j] === 'E') cols[j] += 1; } if (arr[i][j] === '0' && rows + cols[j] > result) result = rows + cols[j]; } } return result; }; console.log(killEnemy(arr));
출력
콘솔의 출력은 -
3