[프로그래머스] 도넛과 막대 그래프 풀이

riassuc·2024년 1월 25일

[프로그래머스] 도넛과 막대 그래프 힌트

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);
};
profile
riassuc

0개의 댓글