[프로그래머스/C++] 네트워크

연성·2021년 9월 1일
0

코딩테스트

목록 보기
227/261

[프로그래머스/C++] 네트워크

1. 문제

네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

2. 제한사항

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.

3. 풀이

  • 분리 집합을 활용해서 풀었다.
  • 각 그래프의 연결 상태를 확인하고 연결되어 있으면 unionParent를 해주어 연결되어 있다고 표시한다.
    • i == j를 기준으로 대칭이기 때문에 절반만 탐색한다.
    • i == j는 항상 1이기 때문에 탐색할 필요가 없다.
    • 쓸데없는 탐색을 줄여준다.
for (int i = 0; i < computers.size(); ++i) {
	for (int j = 0; j < i; ++j) {
		if (computers[i][j] == 1) unionParent(i, j, parent);
        }
    }
  • 연결 표시가 모두 끝나면 부모가 총 몇 개인지 확인한다.
    • 이 때 parent 배열의 값을 확인하는 것이 아니라 findParent 함수를 이용해야 한다.
    • 중복을 제거하고 부모의 개수를 알기 위해 set 자료구조를 이용했다.
    • 1부터 N까지 부모를 찾아 집합에 넣어주고 집합의 크기를 return해주었다.

4. 처음 코드와 달라진 점

  • null
  • parent 배열을 전역 변수로 선언하면 좀 더 깔끔하게 구현할 수 있을 것 같은데 아직은 뭐가 더 좋은지 모르겠다.

5. 코드

#include <string>
#include <vector>
#include <set>

using namespace std;

int findParent(int x, int parent[]) {
    if (x == parent[x]) return x;
    else return parent[x] = findParent(parent[x], parent);
}

void unionParent(int a, int b, int parent[]) {
    a = findParent(a, parent);
    b = findParent(b, parent);
    
    if (a < b) parent[b] = a;
    else parent[a] = b;
}

int solution(int n, vector<vector<int>> computers) {
    int parent[200];
    for (int i = 0; i < n; ++i) {
        parent[i] = i;
    }
    
    for (int i = 0; i < computers.size(); ++i) {
        for (int j = 0; j < i; ++j) {
            if (computers[i][j] == 1) unionParent(i, j, parent);
        }
    }
    
    set<int> s;
    for (int i = 0; i < n; ++i) {
        s.insert(findParent(i, parent));
    }
    return s.size();
}

0개의 댓글