
😎풀이
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;
}