220v
젝무의 개발새발
220v
전체 방문자
오늘
어제
  • 분류 전체보기 (255)
    • AI (35)
      • ML, DL 학습 (30)
      • 논문 리뷰 (4)
      • 실습 및 프로젝트 (1)
    • Algorithm (145)
      • LeetCode (13)
      • 프로그래머스 (35)
      • 백준 (96)
      • 알고리즘, 문법 정리 (1)
    • Mobile, Application (17)
      • Flutter (10)
      • iOS, MacOS (7)
    • BackEnd (7)
      • Flask (1)
      • Node.js (5)
      • Spring, JSP..etc (1)
    • Web - FrontEnd (18)
      • JavaScript, JQuery, HTML, C.. (12)
      • React (6)
    • DataBase (1)
      • MySQL (1)
      • Firebase Firestore (0)
      • Supabase (0)
    • Git (1)
    • 기타 툴 및 오류 해결 (3)
    • 강의 (5)
      • Database (3)
      • 암호학 (2)
      • 알고리즘 (0)
    • 후기와 회고 (2)
    • 블로그 꾸미기 (1)
    • 일상과 이것저것 (20)
      • 맛집 (12)
      • 세상사는일 (4)
      • 도서리뷰 (1)
      • 이런저런 생각들 (잡글) (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 다익스트라
  • implementation
  • 프로그래머스
  • Lis
  • 구현
  • dfs
  • 위상 정렬
  • IMPLEMENT
  • Backtracking
  • BFS
  • Priority Queue
  • disjoint set
  • topological sort
  • 티스토리챌린지
  • top-down
  • binary search
  • Mathematics
  • Prefix Sum
  • REACT
  • simulation
  • bitmasking
  • 오블완
  • brute-Force
  • Dynamic Programming
  • two pointer
  • union-find
  • 백준
  • Greedy
  • Minimum Spanning Tree
  • dp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
220v

젝무의 개발새발

Algorithm/백준

[백준] 4195. 친구 네트워크 - Python

2023. 10. 23. 14:30

[Gold II]

 

https://www.acmicpc.net/problem/4195

 

4195번: 친구 네트워크

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

www.acmicpc.net

 

풀이

Union-Find를 이용한, 서로소 집합(Disjoint Set) 응용 문제.

 

기존 Union-Find를 이용한 기본적인 문제와 크게 다르지 않으나,

네트워크에 속한 친구의 수를 따로 계산해줘야 한다. (rank와는 다름.)

 

네트워크에 속한 친구의 수를 기록하는 dictionary를 선언하고, (cnt)

union해 주는 과정에서, root가 되는 쪽에다 다른 쪽의 네트워크 친구 수를 더해버리면 된다.

이 과정에서, 기존 union 함수에서 예외처리 하지 않았던 x==y 일 경우를 예외처리해야 한다.

하지 않으면, 이미 친구 관계임에도 네트워크 친구 수가 다시 한 번 더 더해지는 오류를 범할 수 있다.

 

AC.

T = int(input())

root = {}
cnt = {}

def find(x):
    if root[x] == x:
        return x
    # 경로 압축
    root[x] = find(root[x])
    return root[x]

def union(x, y):
    x = find(x)
    y = find(y)
    
    if x == y:
        return
    
    if x > y:
        root[x] = y
        # y를 root로 설정했으니, y의 네트워크 수에 x의 네트워크 수를 더해서 저장.
        cnt[y] += cnt[x]
    else:
        root[y] = x
        # x를 root로 설정했으니, x의 네트워크 수에 y의 네트워크 수를 더해서 저장.
        cnt[x] += cnt[y]

for _ in range(T):
    F = int(input())
    root = {}   # Union-Find root
    cnt = {}    # 친구 네트워크에 있는 사람 수
    
    for _ in range(F):
        a, b = input().split()
        if a not in root:
            root[a] = a
            cnt[a] = 1
        if b not in root:
            root[b] = b
            cnt[b] = 1
        union(a, b)
        print(cnt[find(a)])

 

    'Algorithm/백준' 카테고리의 다른 글
    • [백준] 2212. 센서 - Python
    • [백준] 18119. 단어 암기 - C++
    • [백준] 20040. 사이클 게임 - Python
    • [백준] 12026. BOJ 거리 - Python
    220v
    220v
    DGU CSE 20 / Apple Developer Academy @ POSTECH 2nd Jr.Learner.

    티스토리툴바