[Programmers] 네트워크 (Python3)

1 분 소요

문제 설명

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

입출력 예

n computers return
3 [[1, 1, 0], [1, 1, 0], [0, 0, 1]] 2
3 [[1, 1, 0], [1, 1, 1], [0, 1, 1]] 1

입출력 예 설명

입출력 예 #1

2개의 네트워크가 있습니다.

입출력 예 #2

1개의 네트워크가 있습니다.

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
31
32
33
34
35
36
37
38
global visit
visit = []

def solution(n, computers):
    global visit
    answer = 0
    visited = [False for _ in range(n )]
    graph = [[] for _ in range(n)]
    for i, computer in enumerate(computers):
        for index, j in enumerate(computer):
            if i != index and j == 1:
                graph[index].append(i)
                visited[index] = True
    
    for i in range(n):
        if i not in visit:
            dfs(graph, i)
            answer += 1
    return answer


        
def dfs(graph, start_node):
    global visit
    
    stack = []
    stack.append(start_node)
    
    while stack:
        node = stack.pop()
        
        for i in graph[node]:
            if i not in visit:
                stack.append(i)
                visit.append(i)


 
1
2
solution(3, [[1, 1, 0], [1, 1, 1], [0, 1, 1]])

1
1

이 문제는 기존의 DFS 문제를 살짝 꼬아서 낸 문제이다.

처음에는 재귀 DFS로 해서 풀려고 했으나, 풀다 보니까 너무 헷갈려서 그냥 global을 사용해서 풀었다.

몇몇 DFS문제의 경우 global을 통해 변수를 공유하면 풀이가 조금 쉬워지는 경향이 있다.

먼저, 노드끼리 이어진 방식을 주로 사용하던 방식으로 변환한다.
[[1, 1, 0], [1, 1, 1], [0, 1, 1]] 의 경우는 [[1], [0, 2], [1]]가 된다.

이렇게 익숙한 graph의 형태로 바꾸고 나면, 평소에 사용하던 dfs를 사용해서 방문처리를 해주면 된다. 단, 한 노드에서 이어진 곳까지 모두 방문처리를 할때마다 하나의 네트워크를 카운팅 해주어야 하므로, visit를 global로 선언해서 방문 처리된 노드에서 dfs를 실행할때는 카운팅 되지 않도록 한다.

카테고리:

업데이트:

댓글남기기