티스토리 뷰

find_set과 union을 사용하는 문제!

 

각 노드마다 부모를 가리키키는 리스트를 만들어주고

union연산을 통해 두 집합을 통합시킨다. 뒤에 오는 인자(y)가 부모노드가 된다.

여기서 find_set연산을 하는데, 노드X가 부모노드값과 같으면 노드 x값이 리턴이 되고 아니라면 다시 find_set함수로 들어가서 부모노드를 찾아 리턴시켜준다.


예시로

union(1,2)을 보면 parent =[0,1,2] 이다.

parent[find_set(2)] = find_set(1)

 

find_set(2)은

if 2 == parent[2]:

 return 2

 

대입하면

union(1,2):

parent[2] = find_set(1) 이 되고

 

find_set(1)은 리턴 1이므로 parent[2] = 1이 되어 

 

parent =[0,1,1]이 된다.

이런식으로 부모노드를 갱신해주어 부모노드의 개수를 출력해주면 되는 문제이다.

 

 

 

#find_set: x를 포함하는 집합을 찾는 연산
def find_set(x):
    if x == parent[x]:
        return x
    else:
        return find_set(parent[x])
# x와 y를 포함하는 두 집합을 통합하는 연산
def union(x,y):
    parent[find_set(y)] = find_set(x)

T = int(input())
for tc in range(1, T + 1):
    N, M = map(int, input().split())
    L = list(map(int,input().split()))
    #출석번호인덱스까지 parent리스트 만들어주기(0번은 사용안함)
    # 부모를 자기 자신으로 정의
    parent = [i for i in range(N + 1)]

    # 두개씩잘라서 한 쌍마다 union연산 해준다.
    for i in range(0,len(L),2):
        union(L[i],L[i+1])

    result = set()

    for i in range(1, N + 1):
        result.add(find_set(i))

    print("#{} {}".format(tc, len(result)))

'알고리즘 > SWEA' 카테고리의 다른 글

[SWEA] 5247. 연산  (0) 2021.04.23
[SWEA] 1486. 장훈이의 높은 선반  (0) 2021.04.18
[SWEA] 1970.쉬운 거스름돈  (0) 2021.04.16
[SWEA] 2819. 격자판의 숫자 이어붙이기  (0) 2021.04.16
[SWEA] 4366. 정식이의 은행업무  (0) 2021.04.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함