티스토리 뷰
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
링크
TAG
- javascript
- 비동기패턴
- vue
- 알고리즘
- splide
- N과M
- 프로그래머스
- django
- Pyhton
- DOM
- 위클리챌린지2주차
- 싸피
- Java
- 파이썬
- 트리
- git
- SQL
- AWS
- Python
- SWEA
- commit되돌리기
- SSAFY퇴소
- 백준
- 독학
- vue.js
- 안드로이드스튜디오
- 세션 스토리지
- SSAFY
- 배포
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함