글 작성자: 택시 운전사
반응형

🧶 네트워크 - 깊이/너비 우선 탐색(DFS/BFS) / python


문제 설명

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 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입니다.

😃 나의 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(n, computers):
    lst = []
    for i in range(n):
        lst.append({i})
    for n1 in range(0, n):
        for n2 in range(n1+1, n):
            if computers[n1][n2] == 1:
                print(n1,n2,lst)
                for idx,st in enumerate(lst):
                    if n1 in lst[idx]:
                        idx1 = idx
                    if n2 in lst[idx]:
                        idx2 = idx
                if idx1 != idx2:
                    hap = lst[idx1] | lst[idx2]
                    lst.pop(max(idx2,idx1))
                    lst.pop(min(idx1,idx2))
                    lst.append(hap)
    return len(lst)
cs


네트워크의 연결은 python의 set 자료형으로 표현할 수 있다. set 자료형 안에 있는 원소들은 각각 연결되어있다고 생각해보자, 처음에는 전혀 연결이 없는 각각의 컴퓨터가 각각의 네트워크를 가지고 있다고 집합을 만들어보자, 이제 각 연결정보를 확인하여 컴퓨터들을 연결해주는 시행을 하면 된다. 네트워크는 양방향성이기 때문에 행렬의 대각선을 기준으로 정보가 같다 따라서 대각선 부분을 제외한 오른쪽 윗부분의 정보만 사용하여 컴퓨터1이 있는 집합과 컴퓨터2가 있는 집합을 찾고 만이 그 집합이 다르다면 해당 집합을 합쳐서 저장하면 문제는 마무리 된다.

👀 눈여겨 볼만한 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(n, computers):
    answer = 0
    visited = [0 for i in range(n)]
    def dfs(computers, visited, start):
        stack = [start]
        while stack:
            j = stack.pop()
            if visited[j] == 0:
                visited[j] = 1
            for i in range(0len(computers)):
                if computers[j][i] ==1 and visited[i] == 0:
                    stack.append(i)
    i=0
    while 0 in visited:
        if visited[i] ==0:
            dfs(computers, visited, i)
            answer +=1
        i+=1
    return answer
cs


해당 문제는 깊이/너비 우선 탐색(DFS/BFS) 카테고리에 있었기 때문에 DFS 혹은 BFS로 푼 풀이도 가져와봤다. visited 배열에 각 컴퓨터의 방문 현황을 0으로 해놓고 네트워크를 돌면서 각 컴퓨터를 1로 만들어 최종적으로 모든 visited 배열이 1이 될 때까지 도는 코드이다.

반응형