네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
n-1인 정수로 표현합니다.| n | computers | return |
|---|---|---|
| 3 | [[1, 1, 0], [1, 1, 0], [0, 0, 1]] | 2 |
| 3 | [[1, 1, 0], [1, 1, 1], [0, 1, 1]] | 1 |
예제 #1
아래와 같이 2개의 네트워크가 있습니다.

예제 #2
아래와 같이 1개의 네트워크가 있습니다.

class Solution {
// 방문 여부를 저장할 배열
static boolean[] visit;
// dfs 탐색 메소드
public void dfs(int[][] computers, int i) {
// 방문여부를 true로 변환
visit[i] = true;
// computers의 길이만큼 반복
for(int j = 0; j < computers.length; j++) {
// 같은 컴퓨터가 아니면서 연결이 되어있고, 방문한 적이 없을 경우
if(i != j && computers[i][j] == 1 && !visit[j]) {
// dfs 탐색 재진행
dfs(computers, j);
}
}
return;
}
public int solution(int n, int[][] computers) {
int answer = 0;
visit = new boolean[n];
// n만큼 반복
for(int i = 0; i < n; i++) {
// 방문한 적이 없을 경우
if(!visit[i]) {
// dfs 탐색을 진행
dfs(computers, i);
// 네트워크의 개수 증가
answer++;
}
}
return answer;
}
}
dfs 탐색을 사용하여 진행하였다.
방문 여부를 저장할 visit 배열을 선언한다.
dfs 메소드는 dfs 탐색을 진행하는 메소드로 computers 배열은 주어진 조건이며, int i는 탐색할 컴퓨터의 번호이다.
해당 컴퓨터의 방문여부를 true로 전환한 뒤에 computers의 길이만큼 반복을 진행한다. 이때 i와 j가 같을 경우 computers[i][j]는 같은 컴퓨터를 뜻하게 되므로, i와 j가 다를 경우에 탐색을 진행해야한다. 또한 computers[i][j] == 1을 통해 연결이 되어있는지 확인을 하고 !visit[j]를 통해 방문한 적이 없는지 확인을 한다. 이 모든 조건들을 만족한다면 해당 컴퓨터와 연결된 네트워크를 확인하기 위해 dfs 탐색을 재진행한다.
solution 메소드에서는 answer, visit의 초기화를 진행한다.
n만큼 반복을 진행하는데 해당 컴퓨터가 아직 탐색이 되지 않았을 경우 dfs 탐색을 진행하며 이때 answer를 증가시켜준다.
모든 탐색이 종료된 뒤에 answer를 return 해주면 문제를 해결할 수 있다!
풀었던 Level3 문제들 중에서 쉬운 편에 속하는 문제라고 느꼈다. Level2에서 DFS/BFS 탐색을 많이 해서 그런가.. DFS 탐색에 대한 공부가 잘 되어있었다면 조금 더 풀이할 때 쉽게 접근할 수 있을 것 같다. 이런 문제들을 풀면 코테 준비를 허투루 하고 있진 않구나 라는 생각이 들어서 뿌듯하다 ^^