프로그래머스 <네트워크>
https://programmers.co.kr/learn/courses/30/lessons/43162
코딩테스트 연습 - 네트워크
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있
programmers.co.kr
<네트워크>
n으로 컴퓨터의 수가 들어오고 computers라는 배열에 서로 연결된 노드의 정보가 들어온다.
computers는 2차원 int 배열로 computers[i][j]가 1이면 i와 j가 연결되어 있다는 의미이다.
answer은 연결된 컴퓨터들을 하나의 네트워크로 봤을 때, 몇 개의 네트워크가 존재하는지를 의미한다.
문제 해결
이 문제는 DFS/BFS를 사용해서 풀면 된다.
DFS를 사용하여 문제를 풀었다. visited 배열을 이용해 방문한 computer와 방문하지 않은 computer를 구분하였다.
0부터 n-1까지 for문을 돌려서 방문하지 않았으면 DFS를 호출했다. DFS가 호출된 횟수가 answer이 된다.
(연결된 computer들은 한 computer가 호출됬다면 모두 방문이 되기 때문에 DFS가 호출되지 않는다.)
DFS
자식 노드를 먼저 보며 탐색하는 알고리즘
stack을 이용한다.
stack의 top에 연결된 노드 중 방문하지 않은 노드를 넣고 방문처리 한다. stack이 빌 때까지 이를 반복한다.
코드
import java.util.Stack;
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
boolean[] visited = new boolean[n];
for (int i = 0; i < n; i++) {
visited[i] = false;
}
for (int i = 0; i < n; i++) {
if(!visited[i]) {
answer++;
visited = dfs(n, computers, i, visited);
}
}
return answer;
}
public static boolean[] dfs(int n, int[][] computers, int node, boolean[] visited){
Stack<Integer> stack = new Stack<>();
stack.push(node);
visited[node] = true;
while (!stack.isEmpty()) {
int popN = stack.pop();
for (int i = 0; i < n; i++) {
if (computers[popN][i] == 1 && visited[i] == false) {
visited[i] = true;
stack.push(i);
}
}
}
return visited;
}
}
결과
728x90
'Algorithm' 카테고리의 다른 글
[프로그래머스] 기능개발 (0) | 2021.11.05 |
---|---|
[프로그래머스] k번째 수 (0) | 2021.11.02 |
[프로그래머스] 타겟 넘버 (0) | 2021.10.14 |
백준 1717번 <집합의 표현> (0) | 2021.09.29 |
백준 11724번 <연결요소의 개수> JAVA (0) | 2021.09.26 |
댓글