컴퓨터들이 서로 연결되어 있을 때, 형성된 독립적인 네트워크의 총 개수를 구하는 문제입니다. A와 B가 연결되어 있고 B와 C가 연결되어 있다면 A, B, C는 모두 하나의 네트워크에 속합니다.
연결된 모든 정점을 끝까지 파고드는 DFS(깊이 우선 탐색) 방식을 선택했습니다. 하나의 노드를 방문했을 때 그와 연결된 모든 노드를 연쇄적으로 방문 처리함으로써 하나의 '네트워크' 덩어리를 식별할 수 있습니다.
컴퓨터의 수만큼 boolean[] visit 배열을 생성했습니다.
answer를 1 증가시킵니다.computers[now][i] == 1인 경우(연결된 경우)이면서 아직 방문하지 않은(!visit[i]) 컴퓨터를 찾으면 재귀적으로 탐색을 이어갑니다. 이때 자기 자신(i == now)은 제외하도록 예외 처리를 했습니다.
import java.util.*;
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
boolean[] visit = new boolean[n];
for(int i=0; i<n; i++) {
if(!visit[i]) {
dfs(computers, visit, i, n);
answer++;
}
}
return answer;
}
public void dfs(int[][] computers, boolean[] visit, int now, int n) {
visit[now] = true;
for(int i=0; i<n; i++) {
if(i == now) continue;
if(visit[i]) continue;
if(computers[now][i] == 1) {
dfs(computers, visit, i, n);
}
}
}
}
DFS의 정석: 그래프의 연결 요소 개수를 찾는 전형적인 패턴을 익힐 수 있었습니다.
재귀의 흐름: 재귀 함수가 호출되면서 방문 배열이 어떻게 업데이트되는지 머릿속으로 그려보는 과정이 큰 도움이 되었습니다.
BFS와의 비교: 이 문제는 BFS로도 충분히 해결 가능하지만, 연결된 덩어리를 찾는 데에는 DFS가 코드가 더 간결하다는 점을 느꼈습니다.