문제정의
네트워크의 개수가 몇 개인지 판별하는 문제이다. 기본적인 탐색문제이다.
문제 링크
문제풀이
전체 코드는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import java.util.*;
public class Network {
public static void main(String[] args) { int[][] computers = { {1, 1, 0}, {1, 1, 0}, {0, 0, 1} }; int n = 3; int answer = 0; boolean[] visited = new boolean[n]; for(int i = 0 ; i < n; i++) { if(!visited[i]) { answer++; visited[i] = true; Stack<Integer> stack = new Stack<>(); stack.push(i); while(!stack.empty()) { int t = stack.peek(); stack.pop(); for(int j = 0; j < n; j++) { if(computers[t][j] == 1 && !visited[j]) { visited[j] = true; stack.push(j); } } } } } } }
|
전형적인 탐색문제라 어렵지 않다. 일단 각 컴퓨터를 한번이라도 체크했는지 확인하는 불리안 배열을 생성한다. 그리고 이 배열을 순회하며 만약 한 번도 체크하지 않은 컴퓨터라면 dfs를 실시 한다. 필자는 스택을 이용해서 dfs를 구현했다.
반복 횟수를 계산해보자면 이 된다. 따라서 최고차항을 따로 떼어내면 최종 시간복잡도는 이다.
테스트
예전만 해도 dfs가 왜 스택이고 bfs는 왜 큐인지 이해가 잘 안갔는데 어느 새, 혼자서 아무것도 참고하지 않고 dfs를 구현할 수 있게 되었다. 늦은 감이 없지 않아 있지만, 그래도 성장했음을 느낀다.