프로그래머스

LV3 네트워크 (Java)

whiporithm 2023. 11. 20. 01:52

 


 

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

나는 유니온 파인드를 활용하여 문제를 풀이하였다.

 

연결되어 있는 컴퓨터를 확인하고, union을 진행했다.

 

union find알고리즘 그대로 사용하면 풀 수 있는 문젠데, 마지막에 parent의 원소값으로 판단하는게 아닌 "find_parent" 함수를 실행하여 루트값을 확인해야한다. 

 

코드

import java.util.*;
import java.util.stream.*;

class Solution {
    
    public int find_parent(int[] parent, int x){
        if(parent[x] != x){
            parent[x] = find_parent(parent, parent[x]);
        }
        return parent[x];
    }
    
    public void union_parent(int[] parent, int a, int b){
        a = find_parent(parent, a);
        b = find_parent(parent, b);
        
        if(a<b){
            parent[b] = a;
        } else{
            parent[a] = b;
        }
    }
    
    public int solution(int n, int[][] computers) {
        
        int[] parent = IntStream.range(0, n).toArray();
        Set<Integer> s = new HashSet<>();
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(computers[i][j] == 1){
                    if(find_parent(parent, i) != find_parent(parent, j)){
                        union_parent(parent, i, j);
                    }
                }        
            }
        }
        
        for(int i=0; i<n; i++) s.add(find_parent(parent, i));
        
        return s.size();
    }
}

 

후기

 

- 사실 그냥 DFS로 방문 여부를 따져서 쉽게 풀 수 있다.

 

- union find알고리즘에서 parent 루트값은 항상 find_parent로 찾아야 한다. 잊지말자.. 

'프로그래머스' 카테고리의 다른 글

LV3 야근지수 (Java)  (1) 2023.11.21
LV2 게임 맵 최단거리 (Java)  (0) 2023.11.20
LV3 이중우선순위큐  (0) 2023.11.18
LV2 피로도 (Java)  (0) 2023.11.15
LV2 프로세스 (Java)  (1) 2023.11.14