프로그래머스_네트워크

임정민·2023년 10월 4일
1

알고리즘 문제풀이

목록 보기
113/173
post-thumbnail

프로그래머스 Lv3 BFS/DFS 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/43162

[나의 풀이]

⌛ 55분 소요


from collections import deque

def dfs(start,graph,visited,answer):

    stack = deque([start])

    while stack:

        node = stack.pop()

        if not visited[node]:
            stack.extend(graph[node])
            visited[node] = True

    answer += 1
    return answer,visited
    

def solution(n, computers):
    answer = 0

    graph = {i:[] for i in range(1,len(computers[0])+1)}

    for i in range(1,len(computers)+1):
        for j in range(1,len(computers[0])+1):
            if i!=j:
                if computers[i-1][j-1]==1:
                    graph[i].append(j)
    
    visited = [False for i in range(len(computers[0])+1)]

    for i in range(1,n+1):
        if not visited[i]: 
            answer,visited = dfs(i,graph,visited,answer)

    return answer 

BFS/DFS 문제입니다. 연결된 노드들이 1개의 네트워크라고 할 때 전체 네트워크 갯수를 구하는 문제입니다. 주어진 입력값을 기반으로 그래프 구조를 표현하기 위해 dict형태의 graph구조를 만들었습니다. 또한 하나의 네트워크에서 연결된 노드들을 전부 찾기 위해 DFS로 구현하였고 이때, visitied 리스트와 stack구조를 활용하여 구현하였습니다.

[다른 사람의 풀이1]


def solution(n, computers):
    answer = 0
    visited = [False for i in range(n)]
    for com in range(n):
        if visited[com] == False:
            DFS(n, computers, com, visited)
            answer += 1 #DFS로 최대한 컴퓨터들을 방문하고 빠져나오게 되면 그것이 하나의 네트워크.
    return answer

def DFS(n, computers, com, visited):
    visited[com] = True
    for connect in range(n):
        if connect != com and computers[com][connect] == 1: #연결된 컴퓨터
            if visited[connect] == False:
                DFS(n, computers, connect, visited)

'나의 풀이'와 유사하게 DFS로 구현한 방식입니다. 다른점은 재귀함수로 표현했다는 점입니다.

[다른 사람의 풀이2]


def solution(n, computers):            
    
    def DFS(i):
        visited[i] = 1
        for a in range(n):
            if computers[i][a] and not visited[a]:
                DFS(a)      
                
    answer = 0
    visited = [0 for i in range(len(computers))]
    for i in range(n):
        if not visited[i]:
            DFS(i)
            answer += 1
        
    return answer

재귀함수로 구현한 '다른 사람의 풀이2'와 전체적인 구조는 유사하되 그래프 구조를 따로 dict형태로 표현하지 않았습니다. 2중 리스트 형태의 입력값이 0 혹은 1로 입력되기 때문에 이를 False,True 표현하여 사용하였습니다. 또한 visited 리스트도 0,1로 표현한 풀이로 훨씬 간결한 코드로 해결한 케이스였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글