Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[완전탐색-Union Find] 전력망 둘로 나누기 본문

프로그래밍

[완전탐색-Union Find] 전력망 둘로 나누기

yesungcho 2024. 4. 2. 14:46

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

 

프로그래머스

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

programmers.co.kr

 

Union Find를 이용해 disjoint set을 찾아 노드의 수에 따른 차가 가장 큰 경우를 찾으면 되는 문제.

 

특별히 자체 구현 코드에서 마지막에 최종적으로 parents를 업데이트 하는 코드를 잊지 말자

def Find(v,parents) : 
    if parents[v] != v : 
        parents[v] = Find(parents[v],parents)
    return parents[v]

def Union(x,y,parents,rank) : 
    if rank[x]>rank[y] : 
        parents[y] = x
    if rank[x]<rank[y] : 
        parents[x] = y
    else : 
        parents[y] = x
        rank[x] += 1
    return parents, rank

def solution(n, wires):
    final_diff = []
    for i in range(len(wires)) : 
        wire_rest = wires[:i]+wires[i+1:]
    
        ## makeset
        parents = {}
        rank = {}
        for v in range(1,n+1) : 
            parents[v] = v
            rank[v] = 0
        
        for v1,v2 in wire_rest : 
            x = Find(v1,parents)
            y = Find(v2,parents)
            if x != y : 
                parents, rank = Union(x,y,parents,rank)
        
        ### 이 과정 잊지 말기
        for v in range(1,n+1) : 
            parents[v] = Find(v,parents) 
        
        cases = []
        for case in list(set(parents.values())) :
            cnt = 0
            for node in range(1,n+1) : 
                if parents[node] == case : 
                    cnt += 1
            cases.append(cnt)
        
        final_diff.append(abs(cases[0]-cases[1]))

    #print(final_diff)
    return min(final_diff)

 

 

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

[구현] A와 B (백준 12904)  (0) 2024.04.01
[구현] 삼각달팽이 - 공부용  (0) 2024.04.01
[완전탐색-DFS] 피로도  (0) 2024.03.31
[최대 힙 기초] 이중우선순위큐  (1) 2024.03.30
[BFS] 트리의 부모 노드 찾기  (0) 2024.03.28