
네트워크란 컴퓨터 간 정보 교환이 가능하도록 연결된 형태를 의미한다.
n대의 컴퓨터와 연결 정보가 인접 행렬 형태로 주어질 때,
총 몇 개의 네트워크(연결 요소)가 존재하는지 구하는 문제.
computers[i][j] = 1 → i번과 j번 컴퓨터가 직접 연결됨| 입력 | 설명 |
|---|---|
| n | 컴퓨터의 개수 (1 ≤ n ≤ 200) |
| computers | 인접 행렬 (0/1) |
computers는 인접 행렬인접 행렬을 기반으로 BFS로 연결된 컴퓨터들을 모두 방문하며
BFS가 시작된 횟수 = 네트워크 개수
visited[] 생성import java.util.*;
class Solution {
boolean[] visited;
public int solution(int n, int[][] computers) {
int answer = 0;
visited = new boolean[n];
for(int i = 0; i<n; i++){
if(!visited[i]) {
answer++;
bfs(i, n, computers);
}
}
return answer;
}
public void bfs(int v, int size, int[][] map) {
Queue<Integer> q = new LinkedList<>();
q.offer(v);
while(!q.isEmpty()) {
int cur = q.poll();
visited[cur] = true;
for(int i = 0; i<size; i++){
if(map[cur][i] == 1 && !visited[i]){
q.offer(i);
}
}
}
}
}
연결된 컴퓨터들을 하나의 집합으로 합치는 방식
import java.util.*;
class Solution {
int[] parents;
HashSet<Integer> set = new HashSet<>();
public int find(int a) {
if(parents[a] == a) return a;
return parents[a] = find(parents[a]);
}
public boolean union(int a, int b) {
int aRoot = find(a);
int bRoot = find(b);
if(aRoot == bRoot) return false;
parents[bRoot] = aRoot;
return true;
}
public int solution(int n, int[][] computers) {
parents = new int[n];
for(int i = 0; i<n; i++){
parents[i] = i;
}
for(int i = 0; i<n; i++) {
for(int j = 0; j<n; j++) {
if(i==j) continue;
if(computers[i][j] == 1){
union(i, j);
}
}
}
for(int i = 0; i<n; i++) {
set.add(find(i));
}
return set.size();
}
}
문제 1개를 두 가지 방식으로 풀어보면서
알고리즘 선택에 따라 코드 구조가 달라지는 경험을 할 수 있어 도움되었다.
출처 : 프로그래머스 코딩테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/43162