마음만 바쁜 사람
Published 2022. 4. 25. 23:00
11724-연결 요소의 개수 ALGORITHM/BOJ

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

DFS와 BFS를 둘 다 연습해볼 수 있는 문제이다. 간단한게 DFS와 BFS의 풀이방식을 살펴보면

- DFS(깊이 우선 탐색): 스택 or 재귀를 사용해서 구현

- BFS(너비 우선 탐색): 큐를 사용해서 구현

 

나는 보통 DFS에서 재귀를 사용해서 구현하는데 파이썬의 경우 최대 재귀 횟수가 1000번으로 고정되어 있기 때문에 대부분의 문제를 풀때는 이 제한범위를 늘려주어야 한다. sys.setrecursionlimit() 함수를 사용해 주면 된다. (sys import는 필수!)

# DFS 버전
import sys
sys.setrecursionlimit(10**7)
input = sys.stdin.readline
N, M = map(int, input().split())
field = [[False] * 1001 for _ in range(1001)]
for _ in range(M):
    x, y = map(int, input().split())
    field[x][y] = True
    field[y][x] = True

chk =  [False]* 1001

def dfs(start):
    #chk[start] = True
    for nxt in range(1, 1001):
        if field[start][nxt] and chk[nxt] == False:
            chk[nxt] = True
            dfs(nxt);

ans = 0
for i in range(1, N+1):
    if chk[i] == False:
        ans+=1
        chk[i] = True
        dfs(i)
print(ans)

 

BFS의 경우 큐를 사용해야 하는데 파이썬의 경우 일반 큐보다 덱을 사용하는게 더 빠르다. 이는 우선순위 큐 대신 heapq를 사용하는 이유와 같다.

2022.04.22 - [ALGORITHM/Data Structure] - [Python] min-hip을 이용한 Priority Queue

 

[Python] min-hip을 이용한 Priority Queue

- 최소 힙(min-heap)의 구조 - 삽입/삭제: O(logN) import heapq로 사용 가능 push: heapq.heappush(hq, item) pop: heapq.heappop(hq) import heapq pq = [] heapq.heappush(pq, 6) heapq.heappush(pq, 12) heap..

notbusyperson.tistory.com

빠를수록 나쁠건 없으니까 문제풀이의 경우 덱을 계속해서 사용할 예정이다.

# BFS 버전
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
field = [[False] * 1001 for _ in range(1001)]
for _ in range(M):
    x, y = map(int, input().split())
    field[x][y] = True
    field[y][x] = True

chk =  [False]* 1001

def bfs(start):
    dq = deque()
    dq.append(start)
    while dq:
        now  = dq.popleft()
        if chk[now]:
            continue
        else:
            chk[now] = True
            for nxt in range(1, 1001):
                if field[now][nxt]:
                    dq.append(nxt)
ans = 0
for i in range(1, N+1):
    if chk[i] == False:
        ans += 1
        bfs(i)

print(ans)

'ALGORITHM > BOJ' 카테고리의 다른 글

16946-벽 부수고 이동하기 4  (0) 2022.04.26
2178-미로탐색  (0) 2022.04.26
1058-친구  (0) 2022.04.25
1302-베스트셀러  (0) 2022.04.22
11286- 절댓값 힙  (0) 2022.04.22
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!