반응형
문제
방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
출력
첫째 줄에 연결 요소의 개수를 출력한다.
테스트 케이스
접근
1. 정점 n개와 간선 수 m 개 입력을 받습니다.
2.m번만큼 점간의 관계 입력을 받습니다. ex) 1 2 (1번점과 2번점 연결)
저는 2차배열에 간선 간의 관계를 먼저 저장했습니다.
그리고 visit[]배열을 이용해서 이미 지나간 정점인지 아닌지 저장했습니다.
방문되지 않은 점을 순차대로 돌면서 연결돼있으면 재귀 호출하여 더 연결된 점이 없는지를 탐색합니다.
이를 토대로 구현하니 문제가 해결되었습니다.
코드
import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
/*
11724 problem
*/
static int list[][];
static boolean visit[];
static int count = 0;
static int m;
static int n;
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
list = new int[n+1][n+1];
for(int i=0; i<m; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
list[u][v] = 1;
list[v][u] = 1;
}
visit = new boolean[n+1];
for(int i=1; i<=n; i++) {
if(visit[i] == false) {
dfs(i);
count++;
}
}
bw.write(String.valueOf(count));
bw.flush();
br.close();
bw.close();
}
private static void dfs(int a) {
if(visit[a] == true) {
return;
}
else {
visit[a] = true;
for(int i=1; i<=n;i++) {
if(list[a][i] == 1) {
dfs(i);
}
}
}
}
}
주의
연결요소란 점들 간 연결에서 분리된 모양이 몇 개인지 생각하면 편할 것 같습니다.
반응형
'공부 정리 > 백준' 카테고리의 다른 글
[백준] 자바 1966 프린터 큐 (0) | 2021.08.10 |
---|---|
[백준] 자바 4963 섬의 개수 (0) | 2021.08.09 |
[백준] 자바 1012 유기농 배추 (0) | 2021.08.05 |
[백준] 자바 2667 단지번호 붙이기 (0) | 2021.08.04 |
[백준] 자바 1260 DFS와 BFS (0) | 2021.08.03 |
댓글