[백준 4195번] 친구 네트워크
📌 문제
👊 백준 4195번 - 친구 네트워크
📌 개념
hash
union-find
union(x, y)
: 합하기
- x가 속한 집합과 y가 속한 집합을 합친다. 즉, x와 y가 속한 두 집합을 합치는 연산find(x)
: 찾기
- x가 속한 집합의 대표값(루트 노드 값)을 반환한다. 즉, x가 어떤 집합에 속해 있는지 찾는 연산
✅ 문제 해결
parent
는 각 학생들의 최상위 부모를 담은 dict이다. 즉 parent dict의 key는 각 학생들의 이름, value는 각 학생들의 최상위 부모이다.number
은 각 학생 노드가 가지고 있는 하위 노드의 개수를 담은 dict이다. 즉 number dict의 key는 각 학생들의 이름, value는 각 학생 노드의 하위 노드의 개수이다.union(f1, f2)
: f2가 f1을 가리키도록 합치는 연산이다. 즉 f2는 f1에 연결된 하위 노드이다.find(item)
: item의 root(최상위 부모)를 찾아서 반환하는 함수이다.
예제로 이해하기
Fred Barney / Barney Betty / Betty Wilma
를 입력하는 경우
Fred Barney, Betty Wilma, Barney Betty
를 입력하는 경우
Code
find(item) : 해당 원소의 최종 부모를 찾음
def find(item):
if item == parent[item]:
return item
else:
p = find(parent[item])
parent[item] = p
return parent[item]
union(f1, f2) : 최종 부모를 고려하여 두 개의 노드를 연결함
def union(f1, f2): # f2의 부모는 f1
f1 = find(f1)
f2 = find(f2)
if f1 != f2: # 이거 안해주면 틀리네...
parent[f2] = f1
number[f1] += number[f2]
실행 코드
test_case = int(input())
for _ in range(test_case):
parent = {} # parent의 key는 이름, value는 최상위 부모
number = {} # number의 key는 이름, value는 하위 노드 개수
f = int(input())
for _ in range(f):
f1, f2 = input().split(" ")
if f1 not in parent: # 처음 나왔을 경우 새롭게 추가해줌
parent[f1] = f1
number[f1] = 1
if f2 not in parent: # 처음 나왔을 경우 새롭게 추가해줌
parent[f2] = f2
number[f2] = 1
union(f1, f2)
print(number[find(f1)]) # 최상위 부모에 연결된 노드 개수를 출력한다.
다시 풀어보자 쪼금 어렵다😪
Author And Source
이 문제에 관하여([백준 4195번] 친구 네트워크), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eunseokim/백준-4195번-친구-네트워크저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)