본문 바로가기
알고리즘/SWEA

[SWEA / 창용 마을 무리의 개수 / JAVA / DFS]

by KDW999 2023. 7. 16.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWngfZVa9XwDFAQU 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

문제 접근

정수형 배열 타입의 List 생성해서 마을 내의 아는 사람들 끼리 서로서로 리스트에 번호를 추가시켜준다.

ex)1, 2, 5가 아는 사이일 경우 list[1] = {2, 5}, list[2] = {1,5}, list[5] = {1,2} 처럼 저장될 것이다.

 

여기서 1부터 방문 탐색을 진행

방문하지 않은 번호면 방문후 true로 방문 표시

1번 탐색하러 들어가면 2번은 아직 탐색 전이니까 2번 탐색하러 들어가서 방문 표시

그럼 list[2]의 요소들을 또 탐색했는지 검사, 1은 이미 탐색했으니 다음 5를 탐색

list[5]의 요소들을 탐색하러 들어가면서 쭉 반복한다.

 

이런 식으로 진행하면 연결되어 있는 모든 수 들을 다 탐색하고 더 이상 탐색할 수가 없어서 돌아오면 그룹 숫자 +1이 된다.

제일 처음에 1부터 방문 진행했으니 그 다음 반복문의 숫자로 다시 진행 (2, 5는 이미 방문 체크했으니 바로 continue로 넘어감)

 

이렇게 만들어지는 그룹 수를 파악할 수 있다.

// SWEA

import java.util.*;
import java.io.*;
 
public class Solution {
	
	static int N, M;
	static boolean[] visited;
	static ArrayList<Integer>[] edge;
	
    public static void main(String[] args) throws IOException  {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	int T = Integer.parseInt(br.readLine());
    	
    	for(int t=1; t<=T; t++) {
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	
    	int answer = 0;
    	N = Integer.parseInt(st.nextToken());
    	M = Integer.parseInt(st.nextToken());
    	
    	visited = new boolean[N+1];
    	edge = new ArrayList[N+1];
    	
    	for(int i=1; i<=N; i++) edge[i] = new ArrayList<Integer>();
    	
    	for(int i=0; i<M; i++) {
    		
    		st = new StringTokenizer(br.readLine());
    		int start = Integer.parseInt(st.nextToken());
    		int end = Integer.parseInt(st.nextToken());
    		
    		edge[start].add(end); // 1, 2번이 서로 알 경우 1번 리스트에 2저장
    		edge[end].add(start); // 2번 리스트에 1저장해서 서로 아는 사이라는 걸 인지
    	}
    	
    	for(int i=1; i<=N; i++) {
    		if(visited[i]) continue;
    		dfs(i);
    		answer++;
    	}
    	
    	System.out.println("#"+ t+" "+ answer);
    	}
    }
    
    public static void dfs(int num) {
    	visited[num] = true;
    	
    	for(int nextNum : edge[num]) { // 1, 2, 5가 연결됐을 경우 1,2,5 순차적으로 방문표시 해주기, 끝까지 가서 돌아오면 그룹 횟수 +1
    		if(visited[nextNum]) continue;
    		dfs(nextNum);
    	}
    }
}

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA / 문자열문자열 / JAVA]  (0) 2023.07.16
[SWEA / String / JAVA]  (0) 2023.07.13
[SWEA / 진기의 최고급 붕어빵 / JAVA]  (0) 2023.05.20
[SWEA / 부분 수열의 합 / JAVA]  (0) 2023.05.20
[SWEA / 햄버거 다이어트 / JAVA]  (0) 2023.05.20

댓글