본문 바로가기

프로그래머스 풀이/Lv 3

프로그래머스 - 네트워크(C++)

728x90

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

 

프로그래머스

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

programmers.co.kr

 

처음 봤을 땐 행렬을 그대로 두고 그래프 순회로 풀 수 있을 것 

이라고 생각해서 백준의 

https://www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

와 같게 풀었다. 그러나 생각을 깊게 하지 않았으니 당연히 테스트 케이스만 맞고 채점 돌리니 무더기로 틀렸다. 하는 수 없이 트리를 구성하여 DFS하였다.

 

1. 벡터로 노드를 구성하고 각 벡터에 인접 노드를 넣는다.

2. DFS

 

유니온 파인드로도 풀 수 있다고 하는데 굳이..?

요즘 그래프 문제는 소홀 했는데 오랜만에 복습할 수 있었다.

 

#include <string>
#include <vector>

using namespace std;

vector<int> network[201];
bool check[201] = {false,};
int N;

void dfs(int here){
    for(int i = 0; i < network[here].size(); i++){
        if(check[network[here][i]] == false){
            check[network[here][i]] = true;
            dfs(network[here][i]);
        }
    }
}

int solution(int n, vector<vector<int>> computers) {
    int answer = 0;
    N = n;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(i != j && computers[i][j] == 1){
                network[i].push_back(j);
            }
        }
    }

    for(int i = 0; i < n; i++){
        if(check[i] == false){
            answer++;
            dfs(i);
        }
    }
    
    return answer;
}