function removeStones(stones) {
const adj = new Map();
// Build graph with row/col identifier trick to avoid collisions
for (const [x, y] of stones) {
const row = `r${x}`;
const col = `c${y}`;
if (!adj.has(row)) adj.set(row, []);
if (!adj.has(col)) adj.set(col, []);
adj.get(row).push(col);
adj.get(col).push(row);
}
const visited = new Set();
let components = 0;
function dfs(node) {
visited.add(node);
for (const neighbor of adj.get(node) || []) {
if (!visited.has(neighbor)) {
dfs(neighbor);
}
}
}
for (const [x, y] of stones) {
const node = `r${x}`;
if (!visited.has(node)) {
dfs(node);
components++;
}
}
return stones.length - components;
}
console.log(removeStones([[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]])); // Output: 5
console.log(removeStones([[0,0],[0,2],[1,1],[2,0],[2,2]])); // Output: 3
console.log(removeStones([[0,0]])); // Output: 0