Sliver
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다.
한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자.
1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다.
하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다.
컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다.
컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다.
둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다.
이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
풀이
import java.util.*;
import java.io.*;
class Main {
static boolean[] visited;
static ArrayList<ArrayList<Integer>> g;
static int count = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
g = new ArrayList<>();
visited = new boolean[n+1];
for(int i=0; i<=n; i++){
g.add(new ArrayList<>());
}
StringTokenizer st;
for(int i=0; i<m; i++){
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
g.get(u).add(v);
g.get(v).add(u);
}
visited[1] = true;
dfs(1);
System.out.println(count);
br.close();
}
public static void dfs(int node){
for(int i=0; i<g.get(node).size(); i++){
int newnode = g.get(node).get(i);
if(!visited[newnode]){
visited[newnode] = true;
count += 1;
dfs(newnode);
}
}
}
}
해결방법
1. ArrayList<ArrayList<Integer>> g 에 인접 노드들에 대한 정보를 담는다.
2. 방문을 탐색할 수 있는 visited[] 배열을 생성한다.
3. DFS를 통해 노드들을 탐색한다.
- 1번 노드부터 시작하여 노드를 재귀적으로 반복하여 탐색한다.
(이때 1번 노드는 탐색에서 제외하기 위해 visited[1] 을 true로 세팅한다) - 방문하지 않은 노드를 방문할 때마다 count를 증가시키고, visited를 true로 세팅한다.
https://www.acmicpc.net/problem/2606
'Algorithm > Baekjoon Oline Judge - Java' 카테고리의 다른 글
[백준] 2178_미로탐색 / BFS, 최단경로보장 (1) | 2024.09.18 |
---|---|
[백준] 1012_유기농배추 / DFS, BFS, 상하좌우탐색 (0) | 2024.09.18 |
[백준] 1051_숫자정사각형 (0) | 2024.09.17 |
[백준] 9663_N-Queen / 백트래킹, DFS (0) | 2024.09.17 |
[백준] 11729_하노이 탑 이동순서 / 재귀 (1) | 2024.09.08 |