문제링크
2606번: 바이러스
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍
www.acmicpc.net
문제해석
전형적인 탐색문제입니다. 1번 노드와 연결되어있는 노드의 개수가 몇개인지 파악하면 되므로, DFS 혹은 BFS로 탐색을 하여 연결된 노드를 탐색하면됩니다. 노드를 초기화 할 때는 양쪽 노드에 값을 추가해주어야
문제코드
1. DFS
import java.lang.reflect.Array;
import java.util.*;
import java.io.*;
public class Main {
public static boolean[] visited;
public static ArrayList<ArrayList<Integer>> graph;
public static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
int edge = Integer.parseInt(br.readLine());
visited = new boolean[num+1];
graph = new ArrayList<>();
for (int i = 0; i < num+1; i++) { // 노드 생성
graph.add(new ArrayList<>());
}
for (int i = 0; i < edge; i++) { // 연결되어 있는 노드 초기화
st = new StringTokenizer(br.readLine());
int node = Integer.parseInt(st.nextToken());
int connectNode = Integer.parseInt(st.nextToken());
graph.get(node).add(connectNode);
graph.get(connectNode).add(node);
}
dfs(1);
System.out.print(answer);
}
public static void dfs(int start) {
visited[start] = true;
ArrayList<Integer> nowNode = graph.get(start);
for (int i = 0; i < nowNode.size(); i++) {
if (visited[nowNode.get(i)] == false) { // 아직 방문하지 않았다면 방문하기
answer++;
dfs(nowNode.get(i));
}
}
}
}
2. BFS
import java.sql.Array;
import java.util.*;
import java.io.*;
public class Main {
public static boolean[] visited;
public static ArrayList<ArrayList<Integer>> graph;
public static ArrayDeque<ArrayList<Integer>> deque;
public static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int num = Integer.parseInt(br.readLine());
int edge = Integer.parseInt(br.readLine());
visited = new boolean[num+1];
graph = new ArrayList<>();
deque = new ArrayDeque<>();
for (int i = 0; i < num+1; i++) { // 노드 생성
graph.add(new ArrayList<>());
}
for (int i = 0; i < edge; i++) { // 연결되어 있는 노드 초기화
st = new StringTokenizer(br.readLine());
int node = Integer.parseInt(st.nextToken());
int connectNode = Integer.parseInt(st.nextToken());
graph.get(node).add(connectNode);
graph.get(connectNode).add(node);
}
bfs(1);
System.out.print(answer);
}
public static void bfs(int start) {
visited[start] = true;
deque.add(graph.get(start));
while (deque.size() > 0) {
ArrayList<Integer> nowNode = deque.poll();
for (int i = 0; i < nowNode.size(); i++) {
if (visited[nowNode.get(i)] == false) {
deque.add(graph.get(nowNode.get(i)));
visited[nowNode.get(i)] = true;
answer ++;
}
}
}
}
}'코딩테스트 > 백준' 카테고리의 다른 글
| [JAVA] 2579번 계단 오르기 (0) | 2023.08.22 |
|---|---|
| [JAVA] 10845번 큐 (0) | 2023.08.04 |
| [JAVA] 1018번 체스판 다시 칠하기 (0) | 2023.07.18 |
| [JAVA] 1934번 최소공배수 (0) | 2023.06.30 |
| [JAVA] 2908번 상수 (0) | 2023.02.12 |