📌 문제
https://www.acmicpc.net/problem/2606
⭐ 문제 분석
- 그래프 모델링
- 각 컴퓨터를 노드로 보고, 두 컴퓨터 간의 연결을 엣지로 표현합니다.
- 연결 관계를 기반으로 무방향 그래프를 구성합니다.
- 문제 요구 사항
- 1번 컴퓨터에서 시작하여 바이러스가 전파될 수 있는 모든 컴퓨터의 개수를 계산합니다.
- 방문한 노드를 추적하면서 연결된 모든 컴퓨터를 탐색합니다.
- 알고리즘
- 그래프 탐색 알고리즘인 DFS(깊이 우선 탐색) 또는 **BFS(너비 우선 탐색)**를 사용합니다.
⭐ 해결 방법
- 입력 처리
- 첫 줄에서 컴퓨터의 개수를 입력받습니다.
- 두 번째 줄에서 연결 정보의 개수를 입력받고, 이후 줄에서 연결된 노드 정보를 처리합니다.
- 그래프 구현
- ArrayList를 이용하여 인접 리스트 형태로 그래프를 구성합니다.
- 그래프 탐색
- 1번 컴퓨터에서 시작하여 DFS 또는 BFS로 연결된 모든 컴퓨터를 탐색합니다.
- 탐색 중 방문한 컴퓨터의 개수를 카운트합니다.
- 결과 출력
- 1번 컴퓨터를 제외한 바이러스 전파된 컴퓨터 수를 출력합니다.
✅ 정답 코드
import java.util.*;
public class Virus {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 컴퓨터 수
int m = scanner.nextInt(); // 연결 수
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
// 그래프 입력
for (int i = 0; i < m; i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
graph.get(a).add(b);
graph.get(b).add(a);
}
// 방문 배열
boolean[] visited = new boolean[n + 1];
// DFS 탐색
int result = dfs(1, graph, visited);
// 1번 컴퓨터는 제외하고 출력
System.out.println(result - 1);
}
private static int dfs(int node, List<List<Integer>> graph, boolean[] visited) {
visited[node] = true;
int count = 1; // 현재 노드 포함
for (int next : graph.get(node)) {
if (!visited[next]) {
count += dfs(next, graph, visited);
}
}
return count;
}
}
🗒️ 코드 설명
- 입력 처리
- Scanner를 사용하여 컴퓨터 수와 연결 관계를 입력받습니다.
- ArrayList를 활용해 그래프를 인접 리스트로 저장합니다.
- DFS 탐색
- dfs 메서드를 재귀적으로 호출하여 방문한 노드를 추적합니다.
- 방문한 노드 수를 반환하며, 연결된 모든 노드를 탐색합니다.
- 결과 출력
- 1번 컴퓨터에서 시작한 바이러스 전파 결과에서 1번 컴퓨터를 제외한 수를 출력합니다.
💡 알고리즘 풀이 방법
- 그래프 생성
- 연결 정보를 기반으로 인접 리스트를 생성합니다.
- DFS 탐색
- 1번 컴퓨터를 시작점으로 설정하고, 연결된 모든 노드를 탐색하며 방문합니다.
- 방문한 노드를 visited 배열로 관리합니다.
- 시간 복잡도
- 그래프의 모든 노드를 탐색하므로 O(V + E) (노드 수 + 간선 수)입니다.
'코딩 테스트 일지 📒' 카테고리의 다른 글
[백준] 11724 연결 요소의 개수 | DFS, BFS, 그래프 | 실버 Ⅱ | JAVA (0) | 2024.11.24 |
---|---|
[백준] 2667 단지번호붙이기 | DFS, BFS, 그래프 | 실버 Ⅰ | JAVA (0) | 2024.11.22 |
[백준] 1012 유기농 배추 | DFS, BFS, 그래프 | 실버 Ⅱ | JAVA (1) | 2024.11.20 |
[백준] 11123 양 한마리... 양 두마리... | DFS, BFS, 그래프 | 실버 Ⅱ | JAVA (4) | 2024.11.19 |
[백준] 26169 세 번 이내에 사과를 먹자 | DFS, 백트래킹, 그래프 | 실버 Ⅲ | JAVA (0) | 2024.11.18 |