[백준] 2606 바이러스 자바

ChoRong0824·2023년 7월 13일
0

백준

목록 보기
12/14

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


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    private static ArrayList<ArrayList<Integer>> adjacentList;
    private static boolean[] visited;
    private static int count;

    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());

        // 컴퓨터들의 연결 정보
        adjacentList = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            adjacentList.add(new ArrayList<>());
        }

        visited = new boolean[n + 1]; // 방문 여부 체크
        count = 0; // 1번 컴퓨터와 바이러스에 감염된 컴퓨터 개수를 저장

        for (int i = 0; i < m; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            adjacentList.get(a).add(b);
            adjacentList.get(b).add(a);
        }

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

    private static void dfs(int start) {
        if (visited[start]) {
            return;
        }

        visited[start] = true;

        for (Integer i : adjacentList.get(start)) {
            if (!visited[i]) {
                count++;
                dfs(i);
            }
        }
    }
}

코드 설명 & 접근 방법

컴퓨터의 개수(n)는 7이고, 네트워크 상 연결 쌍(m)의 개수는 6입니다.
1부터 7까지의 인덱스로 이루어진 인접 리스트(adjacentList)를 초기화합니다.
다음은 입력된 연결 쌍에 따라 인접 리스트를 채웁니다.

adjacentList[1] = [2, 5]
adjacentList[2] = [1, 3, 5]
adjacentList[3] = [2]
adjacentList[4] = [7]
adjacentList[5] = [1, 2, 6]
adjacentList[6] = [5]
adjacentList[7] = [4]
  1. dfs(1) 함수를 호출하여 1번 컴퓨터부터 깊이 우선 탐색을 시작합니다.
  2. visited 배열은 각 노드의 방문 여부를 저장하는데 사용되며, count 변수는 1번 컴퓨터와 감염된 컴퓨터의 개수를 저장합니다.
  3. dfs(1) 함수를 호출한 뒤, 방문하지 않은 인접 노드인 2번 컴퓨터를 찾습니다. count를 1 증가시키고, 2번 컴퓨터를 방문한 것으로 표시합니다.
    이어서 다시 dfs를 이용해 2번 컴퓨터와 연결된 미방문 노드를 찾습니다.
  4. 2번 컴퓨터와 연결된 미방문 노드는 3번 컴퓨터입니다. count를 1 증가시키고, 3번 컴퓨터를 방문한 것으로 표시합니다.
    하지만, 3번 컴퓨터와 연결된 미방문 노드는 없으므로, 다시 2번 컴퓨터로 돌아가 미방문 노드를 찾습니다.
  5. 그 다음 2번 컴퓨터와 연결된 미방문 노드는 5번 컴퓨터입니다. count를 1 증가시키고, 5번 컴퓨터를 방문한 것으로 표시합니다.
    이어서 다시 dfs를 이용해 5번 컴퓨터와 연결된 미방문 노드를 찾습니다.
  6. 5번 컴퓨터와 연결된 미방문 노드는 6번 컴퓨터입니다.
    count를 1 증가시키고, 6번 컴퓨터를 방문한 것으로 표시합니다.
    하지만, 6번 컴퓨터와 연결된 미방문 노드는 없으므로 여기서 dfs 탐색이 끝납니다.
  7. 모든 탐색이 종료되면, 1번 컴퓨터와 연결된 컴퓨터의 개수가 저장된 count 값을 출력합니다.
    앞서 말했던 예제 들에서는 count 값이 4로 계산되므로, 결과로 4를 출력합니다.
profile
백엔드를 지향하며, 컴퓨터공학과를 졸업한 취준생입니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글