본문 바로가기
백준 & 프로그래머스

백준.11724.연결 요소의 개수.py

by concho 2023. 9. 12.

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

 

11724번: 연결 요소의 개수

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어

www.acmicpc.net

 

# BFS로 안풀고 집합으로 풀어보기
import sys

if __name__ == '__main__':
    n, m = map(int, sys.stdin.readline().strip().split())
    # 간선이 없을때 처리
    if m == 0:
        print(n)
        exit()
    # 리스트와 집합 형식으로 받기
    node_list, node_lset, total_node_set, cnt = [], [], set(), 1
    for _ in range(m):
        tm = list(sorted(map(int, sys.stdin.readline().strip().split())))
        node_list.append(tm)
        total_node_set.update(tm)
    node_list.sort(key= lambda x:(x[0]))
    # 두 숫자가 기존 집합에 없으면 새로운 집합을 만든다.
    node_set = set(node_list[0])
    for i in range(1, m):
        if not (node_list[i][0] in node_set or node_list[i][1] in node_set):
            cnt += 1
            node_lset.append(node_set.copy())
            node_set.clear()
        node_set.update(node_list[i])
    node_lset.append(node_set.copy())
    # 교집합 검사
    for i in range(len(node_lset)):
        for j in range(i+1, len(node_lset)):
            if node_lset[i] & node_lset[j] != set():
                cnt -= 1
    
    print(cnt - len(total_node_set) + n)

'백준 & 프로그래머스' 카테고리의 다른 글

백준.바이러스.2606.py  (0) 2023.09.15
백준.등수 구하기.1205.py  (0) 2023.09.13
백준.올림픽.8979.py  (0) 2023.09.12
백준.디지털 티비.2816.py  (0) 2023.09.11
백준.카드게임.py  (0) 2023.09.11

댓글