네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
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개의 네트워크가 있습니다.
이번 문제는 연결된 노드들의 그룹 개수를 세는 문제이다. 이러한 문제는 깊이우선탐색이나 너비우선탐색으로 해결이 가능하다. 나는 깊이우선탐색을 활용하여 해결하였다. 우선 그래프를 인접 리스트 형태로 구현한다. 그리고 방문처리를 적용한다. 이 문제에서 탐색이 끝나면 n개의 노드가 모두 방문처리가 되어 있어야 한다. 그리고 dfs함수에는 현재 노드와 연결된 노드 중 방문처리가 되지 않은 노드에 대한 dfs 재귀 호출을 진행하도록 한다. 그리고 n번 반복하는 반복문에서 dfs함수를 호출할 때마다 answer를 1씩 증가시켜 그룹의 개수를 세주는 방식으로 해결하였다.
computers[i]
의 길이만큼 반복하는 j에 대한 for문을 돌린다.computers[i][j]
가 1일 경우 graph[i]
에 j를 넣어준다.visited[cur]
을 True로 갱신하여 방문처리한다.graph[cur]
을 순회하는 nxt에 대한 for문을 돌린다.visited[nxt]
가 False일 경우, dfs(nxt)
를 재귀호출한다.visited[i]
가 False일 경우,dfs(i)
를 호출한다.def solution(n, computers):
answer = 0
graph=[[] for _ in range(n)]
for i in range(len(computers)):
for j in range(len(computers[i])):
if i==j:
continue
elif computers[i][j]==1:
graph[i].append(j)
visited=[False for _ in range(n)]
def dfs(cur):
visited[cur]=True
for nxt in graph[cur]:
if not visited[nxt]:
dfs(nxt)
for i in range(n):
if not visited[i]:
dfs(i)
answer+=1
return answer