Leetcode 547 직관적 풀이 - 2026년 6월 8일

발행: (2026년 6월 9일 AM 12:17 GMT+9)
3 분 소요
원문: Dev.to

출처: Dev.to

Q1) 547. 주의 개수

👉 LeetCode 문제 링크
처음에는 배열의 합이 1인 행(즉, 도시가 자기 자신과만 연결된 경우)을 세면 나머지 모든 도시가 자연스럽게 하나의 주가 될 것이라고 생각했습니다.
그 논리의 결함은: 서로 연결되지 않은 여러 개의 독립된 도시 군집이 존재할 수 있다는 점을 완전히 간과했다는 것입니다(예: 두 도시는 서로 연결돼 있지만, 다른 세 도시는 별도의 그룹을 형성하는 경우).
이를 해결하기 위해 메모장을 꺼내 그래프를 시각적으로 그려보니, 이것이 전형적인 그래프 탐색 문제이며 깊이 우선 탐색(DFS)에 딱 맞는다는 것을 깨달았습니다.
초안에서는 외부 헬퍼 함수(allVisit)를 사용해 visited 배열을 반복적으로 스캔하도록 구현했는데, 이는 불필요한 오버헤드를 발생시켰습니다. 0부터 n‑1까지 모든 도시를 한 번 순회하면서 방문하지 않은 도시를 만나면 DFS를 호출하도록 하면 주의 개수를 훨씬 효율적으로 셀 수 있습니다.

class Solution {
    public int findCircleNum(int[][] isConnected) {
        int cities = isConnected.length;
        int provinces = 0;
        boolean[] visited = new boolean[cities];

        // 각 도시를 순회합니다. 아직 방문되지 않았다면,
        // 새로운 주의 시작을 의미합니다.
        for (int i = 0; i < cities; i++) {
            if (!visited[i]) {
                dfs(i, visited, isConnected);
                provinces++; // 주 개수 증가
            }
        }

        return provinces;
    }

    private void dfs(int city, boolean[] visited, int[][] matrix) {
        visited[city] = true;

        // 인접한, 아직 방문하지 않은 모든 도시를 방문
        for (int i = 0; i < visited.length; i++) {
            if (matrix[city][i] == 1 && !visited[i]) {
                dfs(i, visited, matrix);
            }
        }
    }
}
0 조회
Back to Blog

관련 글

더 보기 »