티스토리 뷰

728x90
반응형

목차

     

    문제

     

    신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 

    한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

    예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 

    1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 

    2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 

    하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

     

    어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 

    컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 

    1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

     

     

    입력

     

    첫째 줄에는 컴퓨터의 수가 주어진다. 

    컴퓨터의 수는 100 이하인 양의 정수이고 각 컴퓨터에는 1번부터 차례대로 번호가 매겨진다. 

    둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 

    이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

     

    출력

     

    1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

     

    풀이

     

    특정 컴퓨터가 웜 바이러스에 감염되었을 때, 해당 컴퓨터와 같은 네트워크에 있는 컴퓨터의 개수를 찾아내는 문제이다.

     

    DFS와 BFS에 익숙해졌다면 그다지 어려운 문제는 아닌데,

     

    그래프 전체를 순회하며 몇 개의 노드를 방문했는지 헤아리면 되기 때문이다.

     

    따라서 이 글에서는 코드블럭으로 설명할 필요 없이 알고리즘을 생략하고, 각각 DFS와 BFS로 풀어본다.

     

    Java

     

    DFS

     

    package BackJoon;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.StringTokenizer;
    
    public class Prob2606 {
    	static List<Integer>[] graph;
    	static boolean[] visited;
    	static int count = 0;
    
    	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());
    
    		graph = new ArrayList[n + 1];
    		for (int i = 0; i <= n; i++) {
    			graph[i] = new ArrayList<>();
    		}
    
    		visited = new boolean[n + 1];
    
    		for (int i = 0; i < m; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int u = Integer.parseInt(st.nextToken());
    			int v = Integer.parseInt(st.nextToken());
    
    			graph[u].add(v);
    			graph[v].add(u);
    		}
    
    		dfs(1);
    
    		System.out.println(count - 1);
    	}
    
    	static void dfs(int node) {
    		visited[node] = true;
    		count++;
    
    		for (int next : graph[node]) {
    			if (!visited[next]) {
    				dfs(next);
    			}
    		}
    	}
    }

     

    BFS

     

    package BackJoon;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayDeque;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.StringTokenizer;
    
    public class Prob2606_BFS {
    	static List<Integer>[] graph;
    	static boolean[] visited;
    	static int count = 0;
    
    	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());
    
    		graph = new ArrayList[n + 1];
    		for (int i = 0; i <= n; i++) {
    			graph[i] = new ArrayList<>();
    		}
    
    		visited = new boolean[n + 1];
    
    		for (int i = 0; i < m; i++) {
    			StringTokenizer st = new StringTokenizer(br.readLine());
    			int u = Integer.parseInt(st.nextToken());
    			int v = Integer.parseInt(st.nextToken());
    
    			graph[u].add(v);
    			graph[v].add(u);
    		}
    
    		bfs(1);
    
    		System.out.println(count - 1);
    	}
    
    	private static void bfs(int start) {
    		ArrayDeque<Integer> queue = new ArrayDeque<>();
    		queue.offer(start);
    		visited[start] = true;
    		count++;
    
    		while (!queue.isEmpty()) {
    			int node = queue.poll();
    			for (int next : graph[node]) {
    				if (!visited[next]) {
    					queue.offer(next);
    					visited[next] = true;
    					count++;
    				}
    			}
    		}
    	}
    }

     

    Python

     

    DFS

    import sys
    
    sys.setrecursionlimit(10**6)
    
    n = int(sys.stdin.readline().rstrip())
    m = int(sys.stdin.readline().rstrip())
    graph = [[] for _ in range(n + 1)]
    visited = [False] * (n + 1)
    cnt = 0
    
    
    def dfs(node):
        global cnt
        visited[node] = True
        cnt += 1
    
        for next in graph[node]:
            if not visited[next]:
                dfs(next)
    
    
    for i in range(m):
        u, v = map(int, sys.stdin.readline().rstrip().split(" "))
        graph[u].append(v)
        graph[v].append(u)
    
    dfs(1)
    
    print(cnt - 1)

     

    BFS

     

    import sys
    from collections import deque
    
    n = int(sys.stdin.readline().rstrip())
    m = int(sys.stdin.readline().rstrip())
    graph = [[] for _ in range(n + 1)]
    visited = [False] * (n + 1)
    cnt = 0
    
    
    def bfs(start):
        global cnt
        queue = deque()
        queue.append(start)
        visited[start] = True
        cnt += 1
    
        while queue:
            node = queue.popleft()
            for next in graph[node]:
                if not visited[next]:
                    queue.append(next)
                    visited[next] = True
                    cnt += 1
    
    
    for i in range(m):
        u, v = map(int, sys.stdin.readline().rstrip().split())
        graph[u].append(v)
        graph[v].append(u)
    
    bfs(1)
    
    print(cnt - 1)

     

    Performance

     

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/11   »
    1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    글 보관함