2606번

2023. 1. 23. 10:20·CS 이론/알고리즘
728x90

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

 

2606번: 바이러스

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어

www.acmicpc.net

이번에는 BFS와 DFS 중에 선택하여 푸는 문제를 풀어보았다. 나는 우선 BFS에 대해 공부하기 위해서 BFS로 풀었다. 그리고 문제를 생각했을 때 DFS보다는 BFS가 접합하다고 생각했다. 왜냐하면 시작 노드와 근접한 모든 노드를 찾는 것이기 때문에 DFS로 하나의 노드에 대해서 계속 찾아갔다가 돌아오는 방식은 오래걸릴 것 같아서이다.

또한 잘못하여 노드의 깊이가 너무 깊을 경우 시간 초과가 발생할 것이라고 생각했기 때문이다.

그래서 다른 BFS구현과 마찬가지로 구현을 했고, 여기서 바이러스에 감염된 컴퓨터수는 방문여부 리스트를 활용하여 계산하였다.

처음에 값이 이상하게 나와서 문제를 다시 읽어보는 일도 있었다.

이 문제에서 주의할 것은 시작노드는 포함하지 않는다는 것이다.

그렇게 방문여부를 판단하면서 인접노드들을 방문하고 방문처리 후 큐에넣는 식으로 처리한다.

 

정답코드는 아래와 같다.

package backjoon.b2606;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class b2606 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int node = Integer.parseInt(br.readLine());
        int edge = Integer.parseInt(br.readLine());
        StringTokenizer st;
        Graph g = new Graph(node);
        for(int i=0; i<edge; i++){
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            g.addEdge(u,v);
        }
        g.bfs(1);
        int count = 0;
        for(boolean i : g.visit){
            if(i){
                count++;
            }
        }
        System.out.println(count-1);
    }
}
class Graph{
    int node;
    LinkedList<Integer>[] adj;
    boolean[] visit;
    Queue<Integer> queue;
    public  Graph(int node){
        this.node=node;
        adj=new LinkedList[node+1];
        visit=new boolean[node+1];
        for(int i=0; i<=node; i++){
            adj[i]=new LinkedList<>();
        }
        queue=new LinkedList<>();
    }
    public void addEdge(int u, int v){
        adj[u].add(v);
        adj[v].add(u);
    }
    public void bfs(int R){
        visit[R]=true;
        queue.add(R);
        while (!queue.isEmpty()){
            int tmp=queue.poll();
            for(int i : adj[tmp]){
                if(!visit[i]){
                    visit[i]=true;
                    queue.add(i);
                }
            }

        }
    }
}

 

 

 

아래의 글에 다른 문제로 BFS에 대한 설명을 그림으로 해두었다. 읽어보면 좋을 것 같다.

https://parkjunbackend.tistory.com/50

 

b24444번

https://www.acmicpc.net/problem/24444 24444번: 알고리즘 수업 - 너비 우선 탐색 1 첫째 줄에 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤ N)이 주어진다. 다음 M개 줄에 간

parkjunbackend.tistory.com

 

728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

1012번  (0) 2023.01.26
2667번  (2) 2023.01.25
24444번  (0) 2023.01.21
24480번  (0) 2023.01.20
11286번  (2) 2023.01.19
'CS 이론/알고리즘' 카테고리의 다른 글
  • 1012번
  • 2667번
  • 24444번
  • 24480번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    절개와지조
    DFS
    그래프 순회
    백준
    어렵다
    회고록
    8기
    BFS
    나는 감자
    자바
    오블완
    모각코
    누적합
    Spring
    뛰슈
    타임리프
    프리코스
    JPA
    티스토리챌린지
    감자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
2606번
상단으로

티스토리툴바