Hope Everyone Is Happy

[실버2] 11724. 연결 요소의 개수(Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버2] 11724. 연결 요소의 개수(Java)

J 크 2023. 9. 11. 21:12
728x90
반응형

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

DFS 시작,,


※  문제를 요약하면 아래와 같습니다.

▶ 방향 없는 그래프에서 연결 요소의 갯수를 구하기 (== 그래프가 몇 세트 있는지 구하기)

  Input : 첫째 줄에 정점의 갯수 N, 간선의 갯수 M 입력, 이후 M개의 줄에서 간선의 양 끝점 u와 v제공

  Output : 연결 요소의 갯수 출력


◈ Input - 1

6 5
1 2
2 5
5 1
3 4
4 6

◈ Output - 1

2

◈ Input - 2

6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3

◈ Output - 2

1

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

그래프 탐색을 위해 방문 배열을 N+1 사이즈 만큼 선언 (0번방은 제외)

 그래프 탐색을 DFS로 진행, DFS 탐색 완료 후 방문 배열이 남아있다 == 아직 그래프가 더있다

 그래프를 인접리스트로 구현, DFS는 재귀로 진행

  Input-1  그래프 그림 예시 )

  Input-1  인접 리스트 예시 )

 DFS의 첫 재귀함수가 끝날 때마다 카운트


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
	static BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
	static boolean[] barrVisited;
	static ArrayList<Integer>[] arrList;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(bReader.readLine());

		int N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());

		barrVisited = new boolean[N + 1];
		arrList = new ArrayList[N + 1]; // 인접 리스트

		for (int i = 1; i <= N; i++)
			arrList[i] = new ArrayList<Integer>();

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(bReader.readLine());
			int nParent = Integer.parseInt(st.nextToken());
			int nChild = Integer.parseInt(st.nextToken());

			// 양방향 연결
			arrList[nParent].add(nChild);
			arrList[nChild].add(nParent);
		}

		int nCount = 0;

		// 연결되있는 갯수 만큼 DFS 탐색을 하게 된다.
		// DFS의 탐색 횟수 == 연결 요소의 개수
		for (int i = 1; i <= N; i++) {
			if (!barrVisited[i]) {
				nCount++;
				DFS(i);
			}
		}

		bWriter.write(String.valueOf(nCount));
		bWriter.flush();
		bWriter.close();
	}

	public static void DFS(int nNode) throws IOException {

		if (barrVisited[nNode]) {
			return;
		}

		// 인접리스트에 해당하는 곳을 방문안했으면 탐색하자
		barrVisited[nNode] = true;
		for (int i = 0; i < arrList[nNode].size(); i++) {
			if (!barrVisited[arrList[nNode].get(i)]) {
				DFS(arrList[nNode].get(i));
			}
		}
	}
}

재밌군여~

Good Luck! (피드백 감사합니다!)