[프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)

2025. 4. 29. 23:43·Algorithm

문제 소개

오늘 풀었던 프로그래머스 - 네트워크 문제를 정리합니다.

이 문제는 여러 컴퓨터가 연결되어 있을 때, 서로 연결된 컴퓨터들의 묶음(네트워크)의 수를 구하는 문제입니다.

문제 링크: 네트워크 - 프로그래머스


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. 각 컴퓨터를 하나의 그룹(네트워크)으로 생각하고, 연결된 컴퓨터끼리 같은 그룹으로 합칩니다 (Union)
  2. 모든 연결 관계를 처리한 후, 최종적으로 남은 독립된 그룹(부모가 다른 것들)의 수를 세어 네트워크 개수를 구합니다.

해결 과정 및 코드

핵심 아이디어

  1. 처음에는 컴퓨터 각각을 독립적인 그룹으로 초기화합니다.
  2. 연결 정보가 1인 경우, 두 컴퓨터를 같은 그룹으로 합칩니다(union).
  3. 두 컴퓨터가 이미 같은 그룹이면 아무것도 하지 않습니다.
  4. 서로 다른 그룹을 합칠 때마다 네트워크 개수(answer)를 1 줄입니다.

코드

시간 복잡도 : O(N² × α(N))

  • N은 컴퓨터 수 (최대 200)
  • α(N)은 아커만 함수의 역함수 (거의 상수에 가까움 → 무시 가능)

결국 거의 O(N²) 시간 복잡도로 충분히 해결 가능

 

import java.util.*;

class Solution {
    public static int[] parents;

    public int solution(int n, int[][] computers) {
        int answer = n; // 초기 네트워크 수 = 컴퓨터 수
        parents = new int[n];
        init(n);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                if (computers[i][j] == 0) continue;
                if (union(i, j)) {
                    answer--; // 새로운 연결이 발생할 때마다 네트워크 수 감소
                }
            }
        }
        return answer;
    }

    public void init(int n) {
        for (int i = 0; i < n; i++) {
            parents[i] = i; // 자신을 부모로 초기화
        }
    }

    public int find(int a) {
        if (parents[a] == a) return a;
        return parents[a] = find(parents[a]); // 경로 압축 (Path Compression)
    }

    public boolean union(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if (rootA == rootB) return false; // 이미 같은 그룹
        parents[rootA] = rootB; // 그룹 합치기
        return true;
    }
}

추가: "왜 유니온 파인드인가?"

  • 네트워크(그룹) 관리 문제라서 유니온 파인드로 해결.
  • find : 어떤 컴퓨터가 속한 네트워크(그룹)의 대표를 찾는다.
  • union : 서로 다른 네트워크(그룹)를 하나로 합친다.
  • 경로 압축(Path Compression)을 적용하면 find 연산이 매우 빨라집니다.

만약 BFS나 DFS로 푼다면: 각 컴퓨터를 하나씩 탐색하면서 연결된 컴퓨터를 방문표시하면 됩니다.
하지만 "연결된 그룹끼리 합치는" 문제라면 유니온 파인드가 직관적임

'Algorithm' 카테고리의 다른 글

[프로그래머스] 순위 (플로이드-워셜 Floyd-warshall)  (0) 2025.05.06
[프로그래머스] 방의 개수 (그래프)  (0) 2025.05.05
[프로그래머스] 단어 변환 (BFS)  (0) 2025.04.28
[프로그래머스] 징검다리 (이분탐색)  (0) 2025.04.28
[프로그래머스] 입국 심사 (이분탐색)  (0) 2025.04.27
'Algorithm' 카테고리의 다른 글
  • [프로그래머스] 순위 (플로이드-워셜 Floyd-warshall)
  • [프로그래머스] 방의 개수 (그래프)
  • [프로그래머스] 단어 변환 (BFS)
  • [프로그래머스] 징검다리 (이분탐색)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    시뮬레이션
    Level3
    코테
    백준
    프로그래머스
    Level2
    Kotlin
    문법정리
    알고리즘고득점kit
    boostcamp
    java
    greedy
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)
상단으로

티스토리툴바