본문 바로가기

코딩테스트/백준

[JAVA] 2606번 바이러스

문제링크

 

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