https://www.acmicpc.net/problem/2468
const fs = require("fs")
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().split("\n")
const areaInfo = arr.map(s => s.split(" ").map(Number))
const maxHeight = Math.max(...areaInfo.flat())
const setSafeAreas = (areas, x, y) => {
if (!areas[x][y]) return
areas[x][y] = 0
if (0 <= x - 1) setSafeAreas(areas, x - 1, y)
if (0 <= y - 1) setSafeAreas(areas, x, y - 1)
if (x + 1 < Number(n)) setSafeAreas(areas, x + 1, y)
if (y + 1 < Number(n)) setSafeAreas(areas, x, y + 1)
}
let maxSafeArea = 1
for (let h = 1; h < maxHeight; h++) {
const safeAreas = areaInfo.map(arr => arr.map(l => l <= h ? 0 : 1))
let count = 0;
for (let x = 0; x < Number(n); x++) {
for (let y = 0; y < Number(n); y++) {
if (safeAreas[x][y]) {
setSafeAreas(safeAreas, x, y)
count++
}
}
}
maxSafeArea = Math.max(maxSafeArea, count)
}
console.log(maxSafeArea)
const fs = require("fs")
const [n, ...arr] = fs.readFileSync("/dev/stdin").toString().split("\n")
const areaInfo = arr.map(s => s.split(" ").map(Number))
const maxHeight = Math.max(...areaInfo.flat())
const dx = [-1, 1, 0, 0]
const dy = [0, 0, -1, 1]
const setSafeAreas = (areas, visited, x, y) => {
const queue = [[x, y]]
visited[x][y] = true
while (queue.length > 0) {
const [x, y] = queue.shift()
for (let i = 0; i < 4; i++) {
const nx = x + dx[i]
const ny = y + dy[i]
if (
nx >= 0 && nx < Number(n) &&
ny >= 0 && ny < Number(n) &&
areas[nx][ny] === 1 &&
!visited[nx][ny]
) {
visited[nx][ny] = true
queue.push([nx, ny])
}
}
}
}
let maxSafeArea = 1
for (let h = 1; h < maxHeight; h++) {
const safeAreas = areaInfo.map(arr => arr.map(l => l <= h ? 0 : 1))
const visited = Array.from({ length: Number(n) }, () => Array(Number(n)).fill(false))
let count = 0;
for (let x = 0; x < Number(n); x++) {
for (let y = 0; y < Number(n); y++) {
if (safeAreas[x][y] && !visited[x][y]) {
setSafeAreas(safeAreas, visited, x, y)
count++
}
}
}
maxSafeArea = Math.max(maxSafeArea, count)
}
console.log(maxSafeArea)
탐색 순서
구현 방식
메모리 사용