프로그래머스 - 네트워크 (DFS, BFS) Python

timo·2021년 1월 8일
4
post-thumbnail

문제 설명

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

제한사항

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.

입출력 예

ncomputersreturn
3[[1, 1, 0], [1, 1, 0], [0, 0, 1]]2
3[[1, 1, 0], [1, 1, 1], [0, 1, 1]]1

입출력 예 설명

예제 #1

아래와 같이 2개의 네트워크가 있습니다.

https://grepp-programmers.s3.amazonaws.com/files/ybm/5b61d6ca97/cc1e7816-b6d7-4649-98e0-e95ea2007fd7.png

예제 #2

아래와 같이 1개의 네트워크가 있습니다.

https://grepp-programmers.s3.amazonaws.com/files/ybm/7554746da2/edb61632-59f4-4799-9154-de9ca98c9e55.png


  • 구하려는 네트워크의 갯수는 트리의 갯수와 같다. BFS혹은 DFS를 통해 이를 구할 수 있었다.
  • 한 노드에서 탐색을 시작해 최대한 방문한 것을 1개의 트리로 계산했다.

DFS 사용

def solution(n, computers):
    answer = 0
    visited = [False for i in range(n)]
    for com in range(n):
        if visited[com] == False:
            DFS(n, computers, com, visited)
            answer += 1 #DFS로 최대한 컴퓨터들을 방문하고 빠져나오게 되면 그것이 하나의 네트워크.
    return answer

def DFS(n, computers, com, visited):
    visited[com] = True
    for connect in range(n):
        if connect != com and computers[com][connect] == 1: #연결된 컴퓨터
            if visited[connect] == False:
                DFS(n, computers, connect, visited)

BFS 사용

def solution(n, computers):
    answer = 0
    visited = [False for i in range(n)]
    for com in range(n):
        if visited[com] == False:
            BFS(n, computers, com, visited)
            answer += 1
    return answer

def BFS(n, computers, com, visited):
    visited[com] = True
    queue = []
    queue.append(com)
    while len(queue) != 0:
        com = queue.pop(0)
        visited[com] = True
        for connect in range(n):
            if connect != com and computers[com][connect] == 1:
                if visited[connect] == False:
                    queue.append(connect)

Feedback

  1. 알고리즘 지식으로서 DFS와 BFS를 알고 있었지만, 이를 문제에 적용하고 코드로 구현하는 것은 생각보다 어려웠다.
  2. DFS의 경울 Stack말고 재귀적인 방식으로 구현했는데, 역시 어려운점이 있었다. 아직까지 재귀적인 코드 구현에 버벅임이 많아서 더 많은 연습이 필요하다.
profile
Backend Developer

2개의 댓글

comment-user-thumbnail
2021년 6월 22일

1가지 TIP?을 드리자면 python에서 list pop 메소드에 매개변수가 없으면 시간복잡도가 O(1)이지만 매개변수가 있다면 O(N)이 됩니다.
collections 모듈의 deque로 popleft 하면 시간복잡도를 좀 더 개선할 수 있습니다.

1개의 답글