
😎풀이
storage는 1차원 배열이므로 문자열을 나누어 2차원 배열로 정의한다. 
request를 순회하며 2글자의 처리와 1글자일 경우의 처리를 진행한다.
2-1. 2글자의 경우 해당 셀을 빈(null)값으로 처리한다.
2-2. 1글자의 경우 외부와 연결되어있거나 모서리에 위치한 값인지 확인하여 접근 가능하다면 빈(null)값으로 처리한다. 
storage를 순회하며 빈 값이 아닌 컨테이너의 수를 확인한다. 
- 확인된 컨테이너의 수를 반환한다.
 
function solution(storage, requests) {
  
  const n = storage.length;
  const m = storage[0].length;
  
  const grid = storage.map(row => row.split(''));
  
  for (const req of requests) {
    
    const target = req[0];
    
    
    if (req.length === 2) {
      for (let i = 0; i < n; i++) {
        for (let j = 0; j < m; j++) {
          if (grid[i][j] === target) {
            grid[i][j] = null;
          }
        }
      }
    } else {
      
      const external = Array.from({ length: n }, () => Array(m).fill(false));
      const queue = [];
      
      
      for (let i = 0; i < n; i++) {
        if (grid[i][0] === null && !external[i][0]) {
          external[i][0] = true;
          queue.push([i, 0]);
        }
        if (grid[i][m - 1] === null && !external[i][m - 1]) {
          external[i][m - 1] = true;
          queue.push([i, m - 1]);
        }
      }
      for (let j = 0; j < m; j++) {
        if (grid[0][j] === null && !external[0][j]) {
          external[0][j] = true;
          queue.push([0, j]);
        }
        if (grid[n - 1][j] === null && !external[n - 1][j]) {
          external[n - 1][j] = true;
          queue.push([n - 1, j]);
        }
      }
      
      
      const dirs = [[1, 0], [-1, 0], [0, 1], [0, -1]];
      while (queue.length > 0) {
        const [ci, cj] = queue.shift();
        for (const [di, dj] of dirs) {
          const ni = ci + di, nj = cj + dj;
          if (ni < 0 || ni >= n || nj < 0 || nj >= m) continue;
          
          if (grid[ni][nj] === null && !external[ni][nj]) {
            external[ni][nj] = true;
            queue.push([ni, nj]);
          }
        }
      }
      
      
      
      const toRemove = [];
      for (let i = 0; i < n; i++) {
        for (let j = 0; j < m; j++) {
          
          if (grid[i][j] === target) {
            let isAccessible = false;
            
            if (i === 0 || i === n - 1 || j === 0 || j === m - 1) {
              isAccessible = true;
            } else {
              
              for (const [di, dj] of dirs) {
                const ni = i + di, nj = j + dj;
                if (grid[ni][nj] === null && external[ni][nj]) {
                  isAccessible = true;
                  break;
                }
              }
            }
            
            if (isAccessible) {
              toRemove.push([i, j]);
            }
          }
        }
      }
      
      
      for (const [i, j] of toRemove) {
        grid[i][j] = null;
      }
    }
  }
  
  
  let count = 0;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      if (grid[i][j] !== null) count++;
    }
  }
  
  return count;
}