백준 11400 JS 풀이(실패)

hun2__2·2023년 7월 15일
0

코딩테스트

목록 보기
3/48

구하는 값

간선을 없앴을 떄 두 개 또는 그 이상으로 나누어지는 간선

핵심 아이디어

나는 위의 구하는 값이 => 사이클에 포함되지 않은 노드의 간선 과 동일하다고 생각했고 구현했다.

사이클을 판별하고 사이클에 사용된 노드의 인접리스트를 빈배열로 만들어 주는 것을 반복하여 남아있는 리스트의 개수와 리스트를 담고있는 idx와 리스트를 이용해서 간선을 출력해주면 된다고 생각했다.

코드

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const [v, e] = input[0].split(" ").map(Number);
const graph = Array.from({ length: v + 1 }, () => []);
for (let i = 1; i <= e; i++) {
    const [a, b] = input[i].split(" ").map(Number);
    graph[a].push(b);
    graph[b].push(a);
}

// console.log(graph);

let cycle = [];
const visited = new Array(v + 1).fill(false);

for (let i = 1; i <= v; i++) {
    if (!visited[i]) {
        dfs(i, 0);
    }
}

function dfs(cur, prev) {
    visited[cur] = true;
    cycle.push(cur);

    for (const next of graph[cur]) {
        if (!visited[next]) {
            dfs(next, cur);
        }
        // 방문한적이 있는데 직전노드가 아니라면 사이클
        else if (next !== prev) {
            const idx = cycle.findIndex((v) => v === prev);
            cycle.slice(idx - 1).forEach((idx) => (graph[idx] = []));
            cycle = [];
            // console.log(graph);
        }
    }
    return cycle;
}

let cnt = 0,
    ans = [];
graph.forEach((v, src) => {
    for (const dest of v) {
        cnt++;
        ans.push(src > dest ? dest + " " + src : src + " " + dest);
    }
});

console.log(cnt);
console.log([...new Set(ans)].join("\n"));

근데 틀렸다..... 구글링했을떄도 비슷한 풀이들인것 같은데 JS 억까를 당하고있는것 같다 매우 화가 난다,,,,,,,,,rotlqkf

profile
과정을 적는 곳

0개의 댓글