네트워크
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/43162
문제에 대한 내용
문제 설명
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
제한 조건
- 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
- 각 컴퓨터는 0부터
n-1
인 정수로 표현합니다. - i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
- computer[i][i]는 항상 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개의 네트워크가 있습니다.
접근 방식
- dfs로 출발 노드에서 출발한다.
- 이어진 노드를 방문한다.
- 1,2를 반복하면서 방문하지 않았던 노드에 대해서는 방문시 네트워크의 개수를 +1 한다.
결과
소스 코드
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
boolean visited[] = new boolean[n];
for (int i=0; i<n; i++){
if (!visited[i]){
dfs(n, computers, i, visited);
answer++;
}
}
return answer;
}
private void dfs(int n, int[][] computers, int idx, boolean visited[]) {
visited[idx] = true;
for (int i=0; i<n; i++){
if(computers[idx][i] == 1 && !visited[i]) dfs(n, computers, i, visited);
}
}
}
solution 함수
- n개의 컴퓨터 수만큼 for문을 돈다.
- 만약 i번째 컴퓨터를 방문하지 않았다면, 그 컴퓨터에서 dfs를 시작한다.
- dfs를 마치고 나오면 answer를 +1 한다. (방문하지 않았었기에 네트워크 수 +1)
dfs 함수
- 현재 컴퓨터를 방문처리한다.
- 현재 컴퓨터의 노드를 확인한다.
- 만약 현재 노드와 연결되어 있고, 내가 해당 노드를 방문한 적이 없다면, dfs를 호출해서 타고 들어간다.
결과 이미지
다른 접근 방식
BFS
import java.util.*;
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
Queue<Integer> que = new LinkedList<>();
boolean visited[] = new boolean[n];
for(int i=0; i<n; i++){
if(!visited[i]){
bfs(n, computers, que, i, visited);
answer++;
}
}
return answer;
}
private void bfs(int n, int[][] computers, Queue<Integer> que, int idx, boolean visited[]){
que.offer(idx);
while(!que.isEmpty()){
int start = que.poll();
visited[start] = true;
for (int i=0; i<n; i++){
if (computers[start][i] == 1 && !visited[i]) que.offer(i);
}
}
}
}
solution 함수
- Queue를 이용해서 인전한 노드의 주변 노드를 탐색한다.
- 먼저, 0번째 컴퓨터의 노드부터 탐색을 시작한다.
bfs 함수
- 먼저 탐색할 컴퓨터의 인덱스를 que에 넣는다.
- 인접한 노드를 모두 탐색한다. (que가 빌 때까지)
- 먼저 큐에서 컴퓨터를 꺼낸다.
- 해당 컴퓨터를 방문처리 한다.
- 해당 컴퓨터의 관련 노드를 탐색한다.
- 만약 해당 노드와 연결되어 있고, 방문한 적 없는 컴퓨터의 노드라면 큐에 넣는다.
- 위의 로직을 반복하며, 인접한 노드를 모두 탐색한다.
알게 된 점
없음