본문 바로가기
코딩테스트 준비/백준

[백준] 2606번 - 바이러스 [Java]

by mwzz6 2025. 1. 17.

https://www.acmicpc.net/problem/2606

 

[백준] 2606번 - 바이러스 [Java]
[백준] 2606번 - 바이러스 [Java]


1.  아이디어

 

BFS와 DFS 알고리즘으로 해결했다.


2. 문제풀이

 

컴퓨터와 네트워크가 정점과 간선이 되는 그래프로 해석할 수 있고 1번 컴퓨터가 바이러스를 옮기는 것은 1번 정점에 연결된 다른 정점의 수를 구하는 것과 동일하다. 1번 컴퓨터를 제외하고 세는 것만 주의해서 구현했다.


3. 코드

 

import java.io.*;
import java.util.*;

public class Main_BFS {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());

        List<List<Integer>> adj = new ArrayList<>();
        for (int i = 0; i <= N; i++) {
            adj.add(new ArrayList<>());
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());

            adj.get(u).add(v);
            adj.get(v).add(u);
        }

        int cnt = bfs(N, adj);
        System.out.println(cnt);
    }

    private static int bfs(int N, List<List<Integer>> adj) {
        Queue<Integer> q = new ArrayDeque<>();
        q.offer(1);

        boolean[] visited = new boolean[1 + N];
        visited[1] = true;

        int cnt = 0;

        while (!q.isEmpty()) {
            int node = q.poll();

            for (int next : adj.get(node)) {
                if (visited[next]) continue;

                q.offer(next);
                visited[next] = true;
                cnt++;
            }
        }

        return cnt;
    }

}
import java.io.*;
import java.util.*;

public class Main_DFS {

    private static final List<List<Integer>> adj = new ArrayList<>();
    private static boolean[] visited;
    private static int cnt = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        int M = Integer.parseInt(br.readLine());

        for (int i = 0; i <= N; i++) {
            adj.add(new ArrayList<>());
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());

            adj.get(u).add(v);
            adj.get(v).add(u);
        }

        visited = new boolean[1 + N];

        dfs(1);
        System.out.println(cnt);
    }

    private static void dfs(int node) {
        visited[node] = true;

        for (int next : adj.get(node)) {
            if (visited[next]) continue;

            dfs(next);
            cnt++;
        }
    }

}

4. 후기

 

- BFS

- DFS