백준
[JAVA] 백준 11724번: 연결 요소의 개수
스파게티 코더
2024. 8. 13. 21:24
문제
- 방향 없는 그래프가 주어졌을 때, 연결 요소의 개수를 구하는 문제.
아이디어
- 그래프를 입력 받고, DFS 혹은 BFS를 통해 노드를 탐색하며 연결 가지 수를 체크한다.
- 그래프를 구현하기 위해 2차원 boolean 배열을 선언한 후, 간선을 연결한다.
- 한 노드를 지정해 visited 배열로 연결된 모든 노드를 탐색한 후(가지 하나를 모두 탐색) 카운트를 한다.
- 이 과정을 반복한다.
풀이(BFS)
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
// 그래프 입력을 위한 배열들 선언
static boolean[][] graph;
static boolean[] visited;
// bfs에서 사용하기 위한 큐 선언
static Deque<Integer> queue;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new boolean[N][N];
visited = new boolean[N];
queue = new ArrayDeque<>();
// 그래프 입력
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int n1 = Integer.parseInt(st.nextToken())-1;
int n2 = Integer.parseInt(st.nextToken())-1;
graph[n1][n2] = true;
graph[n2][n1] = true;
}
int answer = 0;
// 각 노드를 탐색하며 연결된 요소를 모두 탐색
// 탐색이 끝나면 한 가지가 모두 탐색된 의미이므로 answer + 1
for(int i=0; i<N; i++) {
if(!visited[i]) {
visited[i] = true;
queue.addLast(i);
bfs();
answer++;
}
}
System.out.println(answer);
}
static void bfs() {
while(!queue.isEmpty()) {
int node = queue.removeFirst();
for(int i=0; i<N; i++) {
if(graph[node][i] && !visited[i]) {
queue.addLast(i);
visited[i] = true;
}
}
}
}
}
풀이(DFS)
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
// 그래프 탐색을 위한 배열들 선언
static boolean[][] graph;
static boolean[] visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new boolean[N][N];
visited = new boolean[N];
// 그래프 입력
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int n1 = Integer.parseInt(st.nextToken())-1;
int n2 = Integer.parseInt(st.nextToken())-1;
graph[n1][n2] = true;
graph[n2][n1] = true;
}
int answer = 0;
for(int i=0; i<N; i++) {
if(!visited[i]) {
dfs(i);
answer++;
}
}
System.out.println(answer);
}
static void dfs(int node) {
visited[node] = true;
for(int i=0; i<N; i++) {
if(graph[node][i] && !visited[i]) {
dfs(i);
}
}
}
}
채점 결과
기타
- DFS와 BFS 풀이 간 유의미한 시간 및 메모리 차이는 없었다.