프로그래머스 > DFS/BFS > 네트워크
https://programmers.co.kr/learn/courses/30/lessons/43162?language=java
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
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로 계산하고 따로 떨어져있는 노드들도 1로 계산해서 모두 더하면 되는 문제였다.
computers[][]
배열이 2차원 배열이지만 사실 자기자신을 경계로 봤을 때,
아랫면이든 윗면이든 한쪽만 보면된다.
그래서 visit[]
배열을 computers.length
의 길이 만큼 1차원 배열로 생성해주면 된다.
computers[][]
를 전체 탐색하면서 방문한적이 없고 1인 경우, DFS()
재귀함수를 통해 계속 연결된 것을 찾아나간다.
Solution 함수에서 전체를 탐색하면서 DFS()
함수가 한번 실행될때만 answer
를 1 증가시켜준다
이렇게 되면 연결된 노드들은 모두 탐색하면서 1이 증가하고,
연결되지 않은 노드들은 다시 Solution 함수로 돌아오기 때문에 answer
가 1 증가되면서
연결된 노드과 떨어져있는 노드간에 개수를 파악할 수 있다.
BFS는 Queue -> que
를 활용해서 해결 할 수 있다.
visit[]
은 DFS와 같이 1차원 배열로 만들었고, 전체를 탐색하면서
1을 만나면 que
에 연결된 1들을 하나씩 넣으면서 que
가 빌 때까지 전체를 탐색한다
이 반복을 도는 과정에서 answer
가 증가되는 것은 DFS와 동일하다.
처음에 문제 이해를 잘 못해서 플로이드 워샬 알고리즘을 사용해서
풀 수 있을 거라고 생각했는데 문제를 잘못 이해했었음..
class Solution { static boolean visit[]; public int solution(int n, int[][] computers) { int answer = 0; visit = new boolean[n]; for(int i=0; i<n; i++) { if(visit[i] == false) { answer++; DFS(i, computers, n); } } return answer; } // End of main static void DFS(int i, int computers[][], int n) { visit[i] = true; for(int j=0; j<n; j++) { if(visit[j] == false && computers[i][j] == 1) { DFS(j, computers, n); } } } // End of DFS } // End of class
import java.util.*; class Solution { static boolean visit[]; static Queue<Integer> que = new LinkedList<>(); public int solution(int n, int[][] computers) { int answer = 0; visit = new boolean[n]; for(int i=0; i<n; i++) { if(visit[i] == false) { BFS(i, computers, n); answer++; } } return answer; } // End of main static void BFS(int i, int computers[][], int n) { que.offer(i); visit[i] = true; while( !que.isEmpty() ) { int value = que.poll(); for(int j=0; j<n; j++) { if(visit[j] == false && computers[value][j] == 1) { visit[j] = true; que.offer(j); } } } } // End of BFS } // End of class