본문 바로가기
스터디IT🌼/Algorithm

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

by 동백사과 2022. 10. 9.

🪴 문제분류

- 깊이 / 너비 우선탐색 ( DFS / BFS )

 

[ 관련 내용 참조 ]

- https://camellia-journey.tistory.com/27?category=1036554 

 

[ 파이썬 ] DFS - 깊이 우선 탐색 / BFS - 넓이 우선 탐색 (Feat. 음료수 얼려 먹기, 미로 탈출 )

DFS와 BFS는 그래프를 탐색하기 위한 가장 대표적인 알고리즘이다. 이번 글에서는 DFS와 BFS에 대해 정리해보고자 한다. 1. DFS - DFS ( Depth-First Search ) 는 깊이 우선탐색으로, 그래프에서 깊은 부분을

camellia-journey.tistory.com

더보기

* 요약 *

DFS : 스택 자료구조 기반

BFS : 큐 자료구조 기반

 

DFS 원리 

1. 탐색 시작 노드를 스택에 넣고 방문 처리!

2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있다면 그 노드를 스택에 넣고 방문처리 

    방문하지 않은 인접노드가 없다면 스택에서 최상단 노드 꺼내기 

3. 2번 과정이 안될때까지 수행 

 

[ 최상단 노드 방문 후 인접 노드를 최상단 노드처럼 dfs 다시 수행 ] !

 

🪴 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🪴 문제 설명

 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 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입니다.
** 입출력 예 **
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번

 

🪴 문제 풀이

1. 해당 문제는 dfs로 풀 수 있다!

2. 1번 노드 부터 시작해서 연결되어있는 노드를 탐색한다. 연결되어있는 노드가 발견되면 그 노드와 연결되어있는 또 다른 노드를 탐색한다. 

3. 다른 노드 방문 전 해당 노드는 방문 했기 때문에 방문 처리를 해놓고 넘어간다! ( 1번과 3번이 연결되어있다고 가정하면 1번 노드와 연결되어있는 노드 탐색 중 3번을 발견! 따라서 3번 노드와 연결되어있는 노드 탐색 시 1번 노드는 다시 보지 않아도 됨! ) 

4. 모든 노드를 시작점으로 dfs를 수행하되 수행 시 방문한 것과 연결되어있던 것들은 표시해두고 dfs를 수행! dfs가 종료되어 돌아왔을 때 count 값 증가 ( 해당 노드와 연결된 애들을 모두 묶음 처리하고 돌아온 것! ) 

 

🪴 문제 풀이 코드 

#dfs 기반 문제 풀이
def solution(n, computers):
    answer = 0
    visited = [0 for _ in range(n)]
    for i in range(len(computers)):
        for j in range(len(computers[0])):
            if computers[i][j] == 1: # 시작점이 1이면 
                dfs(i, computers, visited)
                answer+=1
    return answer


def dfs(x, computers, visited):
    
    visited[x] = 1 # 행부분 방문 완료
    
    for i in range(len(computers[x])):
        if computers[x][i] == 1: # 연결되어있는 노드라면 
            computers[x][i] = 0 # 현재 위치 0으로 변경
            if visited[i] == 0 : # 해당 행을 방문 해볼 예정
                dfs(i, computers, visited) # 해당 행 방문! 거기서 또 연결되어있는 정보 탐색 ( 해당 노드랑 연결되어있는 다른 노드 탐색 )

 


 

댓글