PROGRAMMERS 프로그래머스 : 네트워크

Updated:

시작하면서

 이번 문제는 깊이/너비 우선 탐색(DFS/BFS) 문제이다.

PROGRAMMERS : 네트워크

​

문제 이해

문제를 읽어보자. 먼저 이 문제에서 나오는 변수는 총 1가지이다.

  • vector<vector> computers : 각 컴퓨터들의 연결 상태

​

문제 아이디어

 모든 노드 들을 하나씩 확인하면서 다른 컴퓨터들과의 연결 상태를 확인하는 것은 비효율적이다. 그렇기에 특정 컴퓨터에서 다른 연결된 컴퓨터들을 확인하면서 이미 확인한 컴퓨터는 재확인하지 않도록 해주어야 한다.

​

해결

#include <string.h>
#include <vector>
#include <queue>

using namespace std;

int solution(int n, vector<vector<int>> computers)
{
    queue<int> queue;
    int answer = 0;
    bool* bVisited;

    bVisited = new bool[n];
    memset(bVisited, false, sizeof(bool) * n);

    // 초기값 삽입
    queue.push(0);
    bVisited[0] = true;

    while (queue.empty() == false)
    {
        int computerIndex = queue.front(); queue.pop();

        // 현재 컴퓨터 인덱스와 연결되어 있고, 방문한적 없는 컴퓨터들을 큐에 넣어줌
        for (int i = 0; i < n; i++)
        {
            if (computers[computerIndex][i] == 1 && bVisited[i] == false)
            {
                bVisited[i] = true;
                queue.push(i);
            }
        }

        // 큐가 비어있는지 검사함
        if (queue.empty() == true)
        {
            // 큐가 비어있다면 네트워크 하나를 다 돌았다는 것을 기록
            answer++;

            // 나머지 컴퓨터 중에 확인하지 않은 컴퓨터가 있는지 체크
            for (int i = 0; i < n; i++)
            {
                // 확인하지 않은 컴퓨터는 큐에 넣어서 작업을 진행함
                if (bVisited[i] == false)
                {
                    queue.push(i);
                    bVisited[i] = true;
                    break;
                }
            }
        }
    }

    delete[] bVisited;

    return answer;
}

Leave a comment