본문 바로가기
Coding Test/Programmers

[Programmers] (완전탐색) Lv 2. 전력망을 둘로 나누기

by song.ift 2023. 8. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/86971

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

const bfs = (graph, pivot, visited, vistedDuplication) => {
    const queue = [pivot];
    let cnt = 0;

    while (queue.length) {
        const dest = queue.shift();
        if (vistedDuplication[dest]) return Infinity;

        (visited[dest] = true), ++cnt;
        for (const to of graph[dest]) {
            if (visited[to]) continue;
            queue.push(to);
        }
    }
    return cnt;
};

function solution(n, wires) {
    const graph = wires.reduce((acc, [a, b]) => {
            acc[a].push(b), acc[b].push(a);
            return acc;
        }, Array.from(Array(n + 1), () => []));

    const visitedNone = visitedDivision = new Array(n + 1).fill(false);

    let result = Infinity;
    graph.forEach((form, idx) => {
        for (const division of form) {
            visitedNone[idx] = visitedDivision[idx] = true;
            const divisionCnt = bfs(graph, division, visitedDivision, visitedNone);

            let nodeCnt = 1;
            for (const node of form.filter((e) => e !== division))
                nodeCnt += bfs(graph, node, visitedNone, visitedDivision);

            result = Math.min(result, Math.abs(divisionCnt - nodeCnt));

            visitedDivision.fill(false);
            visitedNone.fill(false);
        }
    });
    return result;
}

GitHub : 

댓글