네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
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
자료구조를 이용했다.null
parent
배열을 전역 변수로 선언하면 좀 더 깔끔하게 구현할 수 있을 것 같은데 아직은 뭐가 더 좋은지 모르겠다.#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();
}