728x90
반응형
문제 파악
-n개의 노드가 주어지고, n개의 노드와 연결 된 노드의 인덱스에 연결이 유효하면 1, 유효하지 않으면 0을 표시한다.
- 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
- 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
- i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
- computer[i][i]는 항상 1입니다.
접근 방법
💡
-DFS 통해 인접한 노드 순회하고, 인접 없으면 네트워크 끝.
그런 네트워크가 몇개인지 총 카운트 (DFS를 네트워크만큼 수행)
-2차원 배열의 형태로 주어지는 연결 값을 보고, 각 노드가 어디와 연결되었는지 먼저 파악한다.
-코드 작성의 원활함을 위해 셋 그래프를 인접 리스트 형태로 변환, O(n^2)
-start노드는 1번부터 시작, dfs가 끝나면 카운트 -연결되지 않은 노드는 한번의 dfs로 순회가 어려우므로 dfs 구문을 반복문으로 호출
-단, visited 셋에 존재하지 않을 경우에만 다시 한번 dfs 순회한다.
-DFS문제
코드 구현
import java.util.*;
class Solution {
static int cnt=0;
public int solution(int n, int[][] computers) {
Set<Integer> visited = new HashSet<>();
Map<Integer, ArrayList<Integer>> connect = new HashMap<>();
for (int i=1;i<=n;i++) {
connect.putIfAbsent(i, new ArrayList<>());
for (int j=1;j<=n;j++) {
if(computers[i-1][j-1]==1) {
connect.get(i).add(j);
}
}
}
for(int i=1;i<=n;i++) {
if(!visited.contains(i)) {
dfs(connect,i,visited);
cnt++;
}
}
return cnt;
}
public void dfs(Map<Integer, ArrayList<Integer>> connect,int start,Set<Integer> visited){
visited.add(start);
for(int node:connect.get(start)) {
if(!visited.contains(node)) {
dfs(connect,node,visited);
}
}
}
}
배우게 된 점
- 해당 문제에서 dfs의 리턴 구문은 별도로 필요 없다.
- 노드는 1부터 시작이므로 이를 유의해서 데이터를 할당한다.
- 연결 된 노드는 한번의 순회로 조회가 가능하지만, 이 문제는 네트워크가 몇개인지 세어야하므로 노드의 연결을 따라 dfs를 여러번 수행하고 리턴 후 카운트를 증가시킨다.
반응형
'alorithm > programmers' 카테고리의 다른 글
[LeetCode] Is Graph Bipartite? (0) | 2024.08.13 |
---|---|
[LeetCode] Coin Change (0) | 2024.08.13 |
[프로그래머스] 단어 변환 (0) | 2024.08.13 |
[프로그래머스] 타겟 넘버 (0) | 2024.08.13 |
[프로그래머스] N-Queen (0) | 2024.08.13 |