알고리즘

[백준 Java] 4195번: 친구 네트워크, union-find

Lahezy 2023. 3. 1.
728x90

🔗 문제링크 🔗

 

4195번: 친구 네트워크

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진

www.acmicpc.net


🌟 생각 흐름 🌟

두 친구에 대한 이름에 대한 저장이 필요해서 HashMap을 이용해서 이름과 배열에 할당할 index를 저장했다.

배열의 사이즈는 n개의 라인에 모두 서로 다른 친구가 나올 수 있을 것 같아 2*n으로 할당했다.

이후에는 친구의 이름이 해시에 없다면 저장하고 있다면 찾아온다.(만약 그냥 저장하면 index번호가 꼬이므로 저장하지 않는다)

두 친구가 이미 친구 관계인 경우에는 친구의 개수를 리턴하고 친구가 아닌 경우에만 union을 진행한다 

union을 하는 경우에 두 사람중의 부모 중에 index가 낮은 곳에 다른 친구 수를 더하여 저장하고 찾은 부모 인덱스 중에 더 작은 인덱스를 리턴하도록 하여 바로 Main에서 친구 수를  출력하도록 하였다.

이것이 가능한 이유는 모든 union을 할때마다 친구들 중에 작은 index를 가진 친구에게 저장할 것이고 이후에 자신의 친구 중 index가 가장 작은(findParent를 통해 나온 index)의 친구수를 이용하면 풀 수 있기 때문에 가능하다. 


🍳 코드 🍳

728x90

댓글