Study(진행중)/항해99

99클럽 코테 스터디 31일차 TIL / 네트워크(프로그래머스)

Ski_ 2024. 8. 21. 20:24

오늘의 학습 키워드

   - 알고리즘

   - 그래프 탐색

   - 유니온-파인드

공부한 내용 본인의 언어로 정리하기

https://school.programmers.co.kr/learn/courses/30/lessons/43162

유니온 파인드 + 그래프 탐색 알고리즘이 합쳐진 문제를 풀었다.

아이디어가 바로 떠올라서 금방 풀었다.

 

풀이 과정은 다음과 같다.

1. union-find 코드 작성

1 - 1. union(a, b) : a와 b집합이 있을때 두 집합을 합치는 연산

1 - 2. find(a) : a집합의 부모는 누구인지 확인하는 연산

2. 제공된 그래프를 반복문을 돌며 연결되었다면 union

2 - 1. 이 때 computers[i][j] = computers[j][i]이므로 반복문을 돌 때 아래와 같은 범위만 계산하면 됨

3. 모든 그래프에 대한 네트워크가 만들어졌다면, 모든 컴퓨터에 대해 반복문을 돌며 find 연산으로 중복을 제외한 모든 네트워크를 구하기 위해 set에 추가

 

풀이는 다음과 같다.

import java.util.*;

class Solution {
    
    int[] parents;

    public int solution(int n, int[][] computers) {
        
        parents = new int[n];
        
        for (int i = 0; i < n; i++) parents[i] = i;
        
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (i == j) continue;
                if (computers[i][j] == 1) union(i, j);
            }
        }
        
        HashSet<Integer> networkSet = new HashSet<>();
        for (int parent : parents) {
            networkSet.add(find(parent));
        }
        
        return networkSet.size();
    }
    
    boolean union(int a, int b) {
        
        int parentA = find(a);
        int parentB = find(b);
        
        if (parentA == parentB) return false;
        
        parents[parentA] = parentB;
        return true;
    }
    
    int find(int a) {
        if (parents[a] == a) return a;
        return parents[a] = find(parents[a]);
    }
    
}
반응형