Regalos sin vigilancia
El grinch quiere robar los regalos de Navidad del almacén. Para ello necesita saber qué regalos no tienen vigilancia.
El almacĂ©n se representa como un array de strings (string[]), donde cada regalo (*) está protegido si su posiciĂłn está junto a una cámara (#). Cada espacio vacĂo se representa con un punto (.).
Tu tarea es contar cuántos regalos están sin vigilancia, es decir, que no tienen ninguna cámara adyacente (arriba, abajo, izquierda o derecha).
Ten en cuenta: solo se considera como “adyacente” las 4 direcciones cardinales, no en diagonal.
Los regalos en las esquinas o bordes pueden estar sin vigilancia, siempre que no tengan cámaras directamente al lado.
findUnsafeGifts([
'.*.',
'*#*',
'.*.'
]) // âžž 0
// Todos los regalos están junto a una cámara
findUnsafeGifts([
'...',
'.*.',
'...'
]) // âžž 1
// Este regalo no tiene cámaras alrededor
findUnsafeGifts([
'*.*',
'...',
'*#*'
]) // âžž 2
// Los regalos en las esquinas superiores no tienen cámaras alrededor
findUnsafeGifts([
'.....',
'.*.*.',
'..#..',
'.*.*.',
'.....'
]) // âžž 4
// Los cuatro regalos no tienen cámaras, porque están en diagonal a la cámara
Solution
function findUnsafeGifts(warehouse: string[]): number {
const rows = warehouse.length;
const cols = warehouse[0].length;
let unsafeCount = 0;
const directions: [number, number][] = [[-1, 0], [1, 0], [0, -1], [0, 1]];
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
if (warehouse[row][col] === '*') {
let hasCameraAdjacent = false;
for (const [dx, dy] of directions) {
const newRow = row + dx;
const newCol = col + dy;
if (newRow >= 0 && newRow < rows &&
newCol >= 0 && newCol < cols) {
if (warehouse[newRow][newCol] === '#') {
hasCameraAdjacent = true;
break;
}
}
}
if (!hasCameraAdjacent) {
unsafeCount++;
}
}
}
}
return unsafeCount;
}