ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • playdataAlgo DFS,BFS 예제
    파이썬/알고리즘 공부 2021. 8. 9. 22:41
    728x90

    DFS, BFS예제


    바이러스


    문제

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

    예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.



    입력


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


    출력

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


    예제입력1


    7
    6
    1 2
    2 3
    1 5
    5 2
    5 6
    4 7

    예제출력1


    4

    DFS풀이


    from sys import stdin
    read = stdin.readline
    
    #//어느 노도와 연결되어 있는지 확인하기 위한 dict딕셔너리 생성
    dict = {}
    #//방문 여부 리스트 생성
    visited = []
    
    #// 각인덱스 set함수화 해서 중복없애줌
    for i in range(int(read())):
        dict[i+1] = set()
    
    #//{1: {2, 5}, 2: {1, 3, 5}, 3: {2}, 4: {7}, 5: {1, 2, 6}, 6: {5}, 7: {4}} 모형 구현
    for j in range(int(read())):
        a, b = map(int,read().split())
        dict[a].add(b)
        dict[b].add(a)
    
    #//재귀함수를 이용해 키값의 벨류값중 방문하지 않은 인덱스는 방문처리 해주고 그 벨류값이 또 키값이 되어 계속 돈다
    def dfs(start, dict):
        for i in dict[start]:
            if i not in visited:
                visited.append(i)
                dfs(i, dict)
    
    dfs(1, dict)
    print(len(visited)-1)

    BFS풀이


    from sys import stdin  
    read = stdin.readline
    
    dict = {}  
    visited = \[\]
    
    for i in range(int(read())):  
    dict\[i+1\] = set()
    
    for j in range(int(read())):  
    a, b = map(int,read().split())  
    dict\[a\].add(b)  
    dict\[b\].add(a)  
    #// ----여기까지 똑같음
    
    #// pop한 값이 키가 되어 방문하지 않은 값들을 visited리스트에 넣어주면서 계속 돈다.  
    def bfs(start, dict):
        queue = [start]
        while queue:
            for i in dict[queue.pop()]:
                if i not in visited:
                    queue.append(i)
                    visited.append(i)
    bfs(1,dict)
    print(len(visited)-1)  

    댓글

Designed by Tistory.