1. 문제 설명
서로 연결되어 있는 그래프를 하나의 군집체로 볼 때, 주어진 전체 노드에서 군집체가 총 몇 개 있는지 구하는 문제이다.
2. 접근 방식
- 인접 리스트 형태로, 노드와 연결 정보를 저장한다.
- 방문 배열을 만들고 방문하지 않은 배열을 기점으로 BFS를 실행한다.
한 번 BFS를 돌면, 시작 정점과 연결된 모든 정점은 방문 처리가 될 것이다. 이는 하나의 군집체를 조회한 걸로 볼 수 있다. - 따라서 BFS를 돈 횟수만큼 군집체가 존재하는 것이므로, BFS를 실행한 횟수를 반환하면 된다.
3. 코드 분석
import java.io.*;
import java.util.*;
class Solution {
public int solution(int n, int[][] computers) {
int answer = 0;
ArrayList<Integer> [] lists = new ArrayList [n];
boolean [] isVisited = new boolean [n];
for(int i = 0; i < n; i++){
lists[i] = new ArrayList<>();
for(int j = 0; j < n; j++){
if(computers[i][j] == 1){
if(i==j) continue;
lists[i].add(j);
}
}
}
for(int i = 0; i < n; i++){
if(!isVisited[i]){
answer++;
bfs(lists,isVisited, i);
}
}
return answer;
}
public void bfs(ArrayList<Integer> [] lists, boolean [] isVisited, int node) {
ArrayDeque<Integer> aq1 = new ArrayDeque<>();
aq1.add(node);
isVisited[node] = true;
while(!aq1.isEmpty()){
int now = aq1.poll();
for(int i = 0; i < lists[now].size(); i++){
int next = lists[now].get(i);
if(!isVisited[next]){
isVisited[next] = true;
aq1.add(next);
}
}
}
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] n*2 배열 자르기 문제 풀이 java (0) | 2024.09.05 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 문제 풀이 java (0) | 2024.09.05 |
99클럽 코테 스터디 29일 TIL + [LeetCode] maximum-profit-job-scheduling 풀이설명 (0) | 2024.08.20 |
99클럽 코테 스터디 28일차 + [백준] 1874 스택 수열 java 풀이 (0) | 2024.08.18 |
[백준] 30458 팰린드롬 애너그램 java 풀이 (0) | 2024.08.16 |