[프로그래머스] 도넛과 막대 그래프 힌트
function solution(edges) {
const [map, set] = edges.reduce(([map, set], [a, b]) => {
map.set(a, map.get(a) + 1 || 1);
set.add(b);
return [map, set];
}, [new Map(), new Set()]);
const added = [...map.entries()]
.filter(([key, val]) => !set.has(key))
.sort((a, b) => a[1] - b[1])
.pop()[0];
const res = {
added,
donut: 0,
stick: 0,
curve: 0
};
const [hash, fromAdded] = edges.reduce(([acc, fromAdded], [a, b]) => {
if (a === added) {
fromAdded.push(b);
} else {
if (acc[a]) acc[a].push(b);
else acc[a] = [b];
}
return [acc, fromAdded];
}, [{}, []]);
while (fromAdded.length) {
const start = fromAdded.pop();
let stack = hash[start] || [];
let len = stack.length;
let stickFlag = true;
if (len) {
const visit = new Set([start]);
while (len) {
if (len > 1) {
stickFlag = false;
res.curve++;
break;
}
const cur = stack.at(0);
if (visit.has(cur)) {
stickFlag = false;
res.donut++;
break;
}
stack = hash[cur] || [];
len = stack.length;
visit.add(cur);
}
}
if (stickFlag === true) {
res.stick++;
}
}
return Object.values(res);
};