본문 바로가기

알고리즘/문제 풀이

💜 2606 바이러스 JAVA

1. 개요

아주 기본적인 BFS로 풀 수 있는 간단한 문제이다. 이 문제가 잘 안 풀리는 사람은 BaaaaaaaaarkingDog님의 그래프 강의를 보고 오길 바란다. 
실버 3도 식은 땀 흘리며 풀었다... 재활운동 시작!
내가 한번 틀렸었는데, 이유는 양방향 그래프임을 생각해주지 않고 풀어서 이다. 이론 정리 다시 해야겠다. 

2. 소스코드

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

public class Main {
    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int V = Integer.parseInt(br.readLine());
        int E = Integer.parseInt(br.readLine());

        boolean [] isVisited  = new boolean[V+1];
        int virusCnt = 0;

        // 1) 인접 리스트 만들기
        ArrayList<Integer> [] lists = new ArrayList[V+1];

        // 2) 인접 리스트 초기화
        for (int i = 0; i < lists.length; i++) {
            lists[i] = new ArrayList<>();
        }

        for (int i = 0; i < E; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            lists[from].add(to);
            lists[to].add(from);
        }

        // 3) BFS 시작
        ArrayDeque<Integer> aq1 = new ArrayDeque<>();

        // 4) 맨 처음 넣는 1의 경우 방문 처리 해주기
        aq1.add(1);
        isVisited[1] = true;

        while(!aq1.isEmpty()) {
            int now = aq1.poll();

                for (int i = 0; i < lists[now].size(); i++) {
                   if(!isVisited[lists[now].get(i)]){
                       aq1.add(lists[now].get(i));
                       isVisited[lists[now].get(i)] = true;
                       virusCnt++;
                   }
                }
        }

        System.out.printf("%d", virusCnt);

    }
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

💜 2589 보물섬  (0) 2024.03.06
💜 2667번 단지 번호 붙이기 JAVA  (0) 2024.03.02
💔 9663 N-Queen java  (0) 2024.01.11
💔5525번 IOIOI  (0) 2024.01.05
💔전깃줄  (0) 2024.01.05