개발일지

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 함수를 작성하시오.

제한사항

컴퓨터의 개수 n1 이상 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,0,1]] 1

 

 내 풀이

 

이 문제는 그래프를 그려 연결되어있는 그래프의 갯수를 구해야 하므로, 연결된 노드들을 따라서 탐색을 하다가 연결이 끊기면 하나의 네트워크가 끝난것으로 다른 노드를 찾아 계속 찾는 DFS로 구현해보았다.

 

int answer = 0;
    vector<bool> visited(n, false);

    for(int i = 0; i < n; i++)
    {
        if(visited[i] == false)
        {
            DFS(computers, visited, i, n);

            answer++;
        }
    }

일단 해당 컴퓨터의 방문여부를 체크하는 visited Vector와 네트워크의 갯를 저장하는 변수 answer를 만들어준다.

그리고 컴퓨터들의 방문여부를 체크한다.

  • 만약 해당 컴퓨터를 방문한적 없으면
    • 또하나의 네트워크 이므로 answer의 갯수를 1 늘려준다.(answer++)
    • DFS탐색을 돌려준다(DFS(컴퓨터 연결정보 Vector, 방문여부 Vector, 현제 노드, 컴퓨터 갯수))

 

void DFS(vector<vector<int>>& computers, vector<bool>& visited, int index, int n)
{
    visited[index] = true;
    for(int i = 0; i < n; i++)
    {
        if (visited[i] == false && computers[index][i] == 1)
            DFS(computers, visited, i, n);
    }
}

일단 현제 노드(컴퓨터)를 방문처리 해주고 방문한적이 없고 서로 연결이되어있는 노드들을 찾아 재귀를 돌려준다.

 

	return answer;

이렇게 총 네트워크의 갯수를 반환시켜주면 된다.

 

 전체 코드

#include<iostream>
#include <vector>
using namespace std;

void DFS(vector<vector<int>>& computers, vector<bool>& visited, int index, int n)
{
    visited[index] = true;
    for(int i = 0; i < n; i++)
    {
        if (visited[i] == false && computers[index][i] == 1)
            DFS(computers, visited, i, n);
    }
}

int solution(int n, vector<vector<int>> computers) 
{
    int answer = 0;
    vector<bool> visited(n, false);

    for(int i = 0; i < n; i++)
    {
        if(visited[i] == false)
        {
            DFS(computers, visited, i, n);

            answer++;
        }
    }

    return answer;
}

 

 결론

 

깊이 우선 탐색을 한층 더 깊이 이해하게 되었다.

profile

개발일지

@damin06

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!