📄 문제
📝 나의 통과 풀이
let input = require("fs")
.readFileSync("/dev/stdin") // /dev/stdin
.toString()
.trim()
.split("\n");
const [N, M] = input[0].split(" ").map(Number);
const edge = input.slice(1).map((item) => item.split(" ").map(Number));
const seokhoGraph = new Map();
edge.forEach(([from, to]) => {
if (seokhoGraph.has(from)) {
seokhoGraph.get(from).push(to);
} else {
seokhoGraph.set(from, [to]);
}
if (seokhoGraph.has(to)) {
seokhoGraph.get(to).push(from);
} else {
seokhoGraph.set(to, [from]);
}
});
let count = 0;
let visited = [];
for (let i = 0; i < N + 1; i++) {
visited[i] = 0;
}
function dfs(start) {
visited[start] = 1;
if (!seokhoGraph.has(start)) {
return;
}
const nodes = [...seokhoGraph.get(start)];
nodes.forEach((item) => {
if (!visited[item]) {
dfs(item);
}
});
}
for (let i = 1; i <= N; i++) {
if (!visited[i]) {
dfs(i);
count++;
}
}
console.log(count);
⌨ 접근법
1. 입력을 잘라서 [정점, 간선] 배열 [N, M] 을 만든다. (근데 M은 안썻다... 왜 이거 지금 봤지?)
2. new Map과 반복문을 사용해서 그래프를 만든다. (class를 쓰다가팀원 'BOB' 덕분에 Map의 세계도 와봤다.)
3. DFS 관련 변수 : (루프 카운트 : count, 방문 확인용 array : visited)
4. DFS를 돌리면 이어진 연결 요소 끼리 쭉 루프를 돌며 visited 에 체크된다.
5. 각 정점마다 모두 DFS에 넣어보면서 visited에 없는 순간(여러개의 연결 요소 그룹 중 새로운 그룹을 만나는 순간) count를 올려준다.
6. 출력을 찍어보면 끝
📚 문제 링크
https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주
www.acmicpc.net
'TEAM 알고싶다 > 성공 문제' 카테고리의 다른 글
[프로그래머스] JavaScript - 거리두기 확인하기 (0) | 2022.07.27 |
---|---|
[Baekjoon (Node.js)] 10026번 적록색약 (0) | 2022.07.19 |
[Baekjoon (Node.js)] 24479번 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2022.07.13 |
[Baekjoon (Node.js)] 2606번 바이러스 (0) | 2022.07.05 |
[Baekjoon (Node.js)] 2164번 카드2 (0) | 2022.06.22 |