[프로그래머스] 네트워크

[프로그래머스] 네트워크

문제

링크 : 프로그래머스


풀이

문제는 컴퓨터가 서로 연결되어 있을 때, 네트워크의 개수를 파악하는 문제이다.
dfs() 이용해서 하나의 노드가 가지고 있는 모든 컴퓨터의 정보를 따라간다.
모두 다 따라갔다가 나오면 개수 한 개를 셀 수 있게 만든다.

나의 솔루션은 2차원 배열 그대로 visit을 만들었지만,
다른 사람 솔루션은 노드 자체에 접근만 하면 visit이 되기 때문에 1차원 배열로 만들었다.
bfs() 방법도 deque를 이용해서 만들어 봤다.

# 1. dfs - my solution
import copy
def dfs(visit, com, n):
   visit[com][com] = 0
   for i in range(0, n):
       if visit[com][i] == 1:
           visit[com][i] = 0
           if visit[i][i] == 1:
               dfs(visit, i, n)

def solution(n, computers):
   answer = 0
   visit = copy.deepcopy(computers)
   for com in range(n):
       if visit[com][com] == 1:
           dfs(visit, com, n)
           answer += 1
   return answer

test1, test2 = 5, [[1, 0, 1, 1, 0, 0], [0, 1, 0, 0, 1, 1], [1, 0, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1]]
print(solution(test1, test2))

# 2. dfs - 다른 사람 솔루션
def dfs(visit, com, n, computers):
    visit[com] = True
    for i in range(n):
        if i != com and visit[i] == False and computers[com][i] == 1:
            dfs(visit, i, n, computers)

def solution(n, computers):
    answer = 0
    visit = [False for _ in range(n)]
    for com in range(n):
        if visit[com] == False:
            dfs(visit, com, n, computers)
            answer += 1
    return answer
# 3 bfs
from collections import deque

def bfs(visit, com, n, computers, deq):
    deq.append(com)
    while len(deq) > 0:
        start = deq.popleft()
        visit[start] = True
        for i in range(n):
            if computers[start][i] == 1 and visit[i] == False:
                deq.append(i)

def solution(n, computers):
    answer = 0
    deq = deque()
    visit = [False for _ in range(n)]
    for com in range(n):
        if visit[com] == False:
            bfs(visit, com, n, computers, deq)
            answer += 1
    return answer

test1, test2 = 3, [[1, 1, 0], [1, 1, 1], [0, 1, 1]]
print(solution(test1, test2))

실수 및 배운 점

처음 문제를 풀 때 visit을 2차원 배열로 만들어서 풀었고, 반쪽만 점검해서 완성시켰다.
하지만 ‘반쪽’만 점검한다는 것이 문제였다. 왜냐하면 노드는 무조건 순서대로 있는 것이 아니었기 때문이다.

bfs에서는 deque를 이용해서 문제를 풀었다. 각 정보를 ‘깊이’가 아닌 너비를 고려해야 했기에
큐에 넣어서 순서가 되면 꺼내 쓰는 방식을 썼다.

방식을 예전에 썼던 방식이기에 기억해서 썼지만, 실전에 다가오면 자꾸 틀릴 기분이 든다.
순서도를 파악해서 완벽하게 내 것으로 만들어야 하는 게 필요하다는 것을 느꼈다.

deque 는 좌우가 뚫리면서 이어져있을 수도 있는 queue라고 생각하자. (양방향 큐이자 선입선출의 방식을 사용한다.)
method는 다음과 같다.
deque.append(item) : item을 오른쪽에 넣는다.
deque.appendleft(item) : item을 왼쪽에 넣는다.
deque.pop() : 맨 오른쪽 item을 리턴하는 동시에 삭제한다.
deque.popleft() : 맨 왼쪽 item을 리턴하는 동시에 삭제한다.
deque.extend(array) : 맨 오른쪽에 리스트의 요소들을 순회하면서 추가한다.
deque.extendleft(array) : 맨 왼쪽에 리스트의 요소들을 순회하면서 추가한다.
deque.remove(item) : deque안에 item 요소를 삭제한다.
deque.rotate(num) : deque안에서 num만큼 회전시킨다. (양수 : 오른쪽 / 음수 : 왼쪽)