포스트

Number of Provinces

LeetCode 547. Number of Provinces

원문

There are n cities. Some of them are connected, while some are not. If city a is connected directly with city b, and city b is connected directly with city c, then city a is connected indirectly with city c.

A province is a group of directly or indirectly connected cities and no other cities outside of the group.

You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the ith city and the jth city are directly connected, and isConnected[i][j] = 0 otherwise.

풀이

최소 스패닝 트리 문제.

도시를 순회하며 도시와 도시 사이가 직접 연결되어 있다면 find 연산으로 두 도시가 연결되어 있는지 확인하고, 그렇지 않다면 union으로 연결시켜준다.
순회가 끝나면 다시 도시를 순회하며 find를 사용해 연결된 도시 그룹의 수를 구한다.

코드

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        def find(p):
            if city[p] != p:
                city[p] = find(city[p])
            return city[p]


        def union(p, q):
            p, q = find(p), find(q)
            if p == q: return
            if p < q: city[q] = p
            else: city[p] = q


        n = len(isConnected)
        city = [i for i in range(n)]
        result = set()

        for i in range(n):
            for j in range(n):
                if i != j and isConnected[i][j] == 1:
                    a, b = find(i), find(j)
                    if a != b: union(a, b)

        for i in range(n):
            find(i)
            result.add(city[i])

        return len(result)

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Solution {
    int[] city;

    private int find(int p) {
        if (city[p] != p) {
            city[p] = find(city[p]);
        }
        return city[p];
    }

    private void union(int p, int q) {
        p = find(p);
        q = find(q);
        if (p == q) {
            return;
        }
        if (p < q) {
            city[q] = p;
        } else {
            city[p] = q;
        }
    }

    public int findCircleNum(int[][] isConnected) {
        int n = isConnected.length;
        city = new int[n];

        for (int i = 0; i < n; i++) {
            city[i] = i;
        }

        Set<Integer> result = new HashSet<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i != j && isConnected[i][j] == 1) {
                    int a = find(i);
                    int b = find(j);
                    if (a != b) {
                        union(a, b);
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            find(i);
            result.add(city[i]);
        }

        return result.size();
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.