반응형
const check = (storage, x, y) => {
const [xlen, ylen] = [storage.length, storage[0].length]
const dx = [-1, 1, 0, 0]
const dy = [0, 0, -1, 1]
const queue = [[x, y]]
const visited = Array.from({ length: xlen }, () => Array(ylen).fill(0))
visited[x][y] = 1
while (queue.length) {
const cur = queue.shift()
const [x, y] = cur
for (let i = 0; i < 4; i++) {
const [nx, ny] = [x + dx[i], y + dy[i]]
if (x === 0 || x === xlen - 1
|| y === 0 || y === ylen - 1) {
return true
}
if (0 <= nx && nx < xlen && 0 <= ny && 0 < ylen &&
!visited[nx][ny] && storage[nx][ny] === '0') {
queue.push([nx, ny])
visited[nx][ny] = 1
}
}
}
return false
}
const solution = (storage, requests) => {
storage = storage.map(row => row.split(''))
const [xlen, ylen] = [storage.length, storage[0].length]
let res = 0
for (let request of requests) {
const remove = []
if (request.length === 1) {
for (let i = 0; i < xlen; i++) {
for (let j = 0; j < ylen; j++) {
if (storage[i][j] === request && check(storage, i, j)) {
res += 1
remove.push([i, j])
}
}
}
} else {
for (let i = 0; i < xlen; i++) {
for (let j = 0; j < ylen; j++) {
if (storage[i][j] === request[0]) {
res += 1
remove.push([i, j])
}
}
}
}
for (let r of remove) {
const [x, y] = r
storage[x][y] = '0'
}
}
return xlen * ylen - res
}
시뮬레이션 + bfs
조각을 뽑은곳은 0으로 채우고 길이 뚫려있는지 확인하는 check함수를 만들음
check 함수 true 조건은 0을 타고 가장 바깥에 도착했는지 여부
더 깔끔하게 짤 수 있어보이는데 처음생각난대로 우다다하니까 통과됨