문제 출처 : 프로그래머스 네트워크
여러 컴퓨터들이 연결되어있는 인접행렬(computers)를 탐색하며 방문 표시
각 컴퓨터마다 탐색하여 같은 네트워크에 있는 컴퓨터를 모두 방문표시한다.
아직 방문하지 않은 컴퓨터에서 한번 탐색이 끝나면 하나의 네트워크를 찾은것이다.
같은 네트워크를 한번의 탐색으로 찾기 위해 DFS 그래프 탐색 알고리즘을 사용한다.
def DFS(computers, visited, now):
visited[now] = True
for i in range(n):
if computers[now][i] and not visited[i] and i != now:
DFS(n, computers, visited, i)
def solution(n, computers):
networks = 0
visited = [False] * n
for i in range(n):
if not visited[i]:
DFS(computers, visited, i)
networks += 1
return networks
def DFS(computers, visited, now):
stack = [now]
visited[now] = True
while stack:
now = stack.pop()
for i, connected in enumerate(computers[now]):
if connected and not visited[i]:
visited[i] = True
stack.append(i)
def solution(n, computers):
networks = 0
visited = [False] * n
for i in range(n):
if not visited[i]:
DFS(computers, visited, i)
networks += 1
return networks
from collections import deque
def DFS(computers, visited, now):
stack = deque([now])
visited[now] = True
while stack:
now = stack.pop()
for i, connected in enumerate(computers[now]):
if connected and not visited[i]:
visited[i] = True
stack.append(i)
def solution(n, computers):
networks = 0
visited = [False] * n
for i in range(n):
if not visited[i]:
DFS(computers, visited, i)
networks += 1
return networks
Stack을 만들때 List를 많이 사용하는데 어떤 블로그에서 List보다 Deque가 성능이 좋다고 사용했다고 해서 궁금했다.
Deque는 양방향에서 삽입,삭제하는데 장점을 갖는 이중 연결 리스트로 구현되어있는 자료구조이다.
어차피 stack은 끝쪽에서 삽입 삭제가 이루어져야하는 자료구조로 List를 사용하더라도 성능상 차이가 크지 않을것 같다.
[두 자료구조 모두 시간 복잡도: O(1)]
그러면 삽입, 삭제시 메모리 관리 측면에서 두 자료구조의 차이점을 생각해 볼 수 있을것 같다.
List
Deque
메모리 재할당 비용 측면에서 List보다 Deque가 더 효율적인것 같다.