문제) - DFS 사용
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 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입니다.
코드)
def dfs(computers, visited, n, start):
stack = [start]
while stack:
j = stack.pop()
if visited[j] == False:
visited[j] = True
for i in range(n):
if computers[i][j] == 1 and visited[i] == False:
stack.append(i)
def solution(n, computers):
visited = [False] * n
answer = 0
for i in range(n):
if visited[i] == False:
dfs(computers, visited, n, i)
answer += 1
return answer
과정)
1) solution 함수에서는 for문 돌면서 해당 컴퓨터에 visited 된 적이 있는지 없는지를 먼저 확인한다. 즉 visited[i] = True 인가 False인가 확인하는 것이다. 만약 방문한 적이 있다면 dfs 함수에서 True로 바뀌어 있기 때문이다.
2) 각각의 노드를 돌면서 dfs 함수로 깊이 우선 탐색을 실행한다.
3) stack에 노드가 있을 때까지 while문을 돌게 되는데, stack에 나오는 노드가 만약 방문되지 않았으면, 방문했다는 표시를 하고(visited[j] = True) for문을 돌게 된다.
4) for문에서는 해당 노드(pop으로 나온 노드)가 다른 노드들과 연결되어 있는지의 유무를 확인한 후, 만약 연결되어 있고(computers[i][j] == 1 ) 해당 노드와 연결되어 있지만 방문하지 않은 노드들만 stack에 들어가게 된다.
시작점으로부터 연결된 모든 컴퓨터를 방문하고, visited 배열에 이를 표시한다. 연결된 모든 컴퓨터를 방문하면, stack이 비어지고 함수가 종료된다. 즉, 하나의 네트워크에서의 노드들을 다 방문한 상황이다. 그렇다면 solution 함수로 돌아가게 된다.
5) dfs 함수의 호출이 완료된 직후, answer를 1 증가시킨다. 이는 방금 탐색을 마친 컴퓨터들이 하나의 독립된 네트워크를 형성한다는 것을 의미한다.
- dfs 함수 내에서 j는 현재 방문하고 있는 노드의 인덱스를 나타낸다. 스택에서 꺼낸 노드의 인덱스가 j에 할당되고, 이를 기준으로 연결된 다른 노드들을 탐색한다. for 문의 range(i)를 통해서.
- start는 solution 함수에서 dfs 함수를 처음 호출할 때, 탐색을 시작할 컴퓨터의 인덱스를 나타내며, 이 값은 solution 함수의 for 루프를 통해 0부터 n-1까지 모든 가능한 값을 순회하게 된다. 이를 통해 모든 컴퓨터를 시작점으로 하여 네트워크 연결 상태를 탐색하게 된다.
'Algorithm' 카테고리의 다른 글
[ 알고리즘 ] 완전탐색 - 최소 직사각형, 모의고사 문제 (0) | 2024.04.16 |
---|---|
[ 알고리즘 ] BFS 문제 - 단어 변환 (0) | 2024.04.12 |
[ 알고리즘 ] DFS, BFS 란? (0) | 2024.04.06 |
[ Python ] 정렬 (2) - list 예시 (0) | 2024.04.05 |
[ Python ] 정렬 (1) - list 개념 (0) | 2024.04.04 |