250x250
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 딕셔너리
- 플랫폼 클래스 로더
- AWS SAA-C03 합격후기
- 파이썬 문자열 메서드
- 파이썬
- stop the world
- 자바
- python
- 코딩테스트
- 스프링 컨테이너
- aws saa-c03
- 알고리즘
- 부트스트랩 클래스 로더
- dfs
- 다이렉트 레퍼런스
- 백준
- 컴포넌트 스캔
- python list method
- 2026 AWS SAA-C03
- getreference
- 자료구조
- 어플리케이션 클래스 로더
- BFS
- 심볼릭 레퍼런스
- 스프링
- Spring
- 파이썬 리스트 메서드
- 클래스 로더 계층
- java
- 객체지향
Archives
- Today
- Total
클라우드 낚시꾼
[백준] 11724번 연결 요소의 개수 - DFS(stack, 재귀함수) (Python3) 본문
728x90


제한 조건과 설계

1. 무방향 그래프다.
2. 정점의 개수가 1000개 이하다.
3. 시간 제한과 메모리 제한이 굉장히 널널하다.
4. 2번과 3번을 고려했을 때 DFS가 좋아 보인다.
자연어 알고리즘
- 무방향 그래프, 방문 테이블, 노드 목록를 생성한다.
- 연결 요소의 개수 cnt를 0으로 초기화 하여 선언한다.
- 노드 목록 하나 하나를 시작 지점으로 설정하여 DFS 탐색을 시도한다.
- 노드가 이미 방문된 지점이면 -> continue
- 노드가 아직 방문되지 않은 지점이면 -> DFS 탐색
- DFS 탐색을 리스트 자료구조를 이용한 Stack 또는 재귀 함수를 이용한 Stack을 이용해 구현한다.
- 가장 중요한 POINT: 스택에 PUSH된 순간 그 지점은 방문될 지점이므로 그 즉시 방문 테이블에 방문 처리를 한다.
- DFS 탐색을 마쳤다면 cnt를 1 증가시킨다.
- 3~5를 반복하다가 종료되면 cnt를 출력한다.
재귀 함수로 Stack을 구현하여 DFS 탐색
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
n,m = map(int, input().split())
graph = [[] for _ in range(n+1)]
visited = [False] * (n+1)
nodes = [n for n in range(1,n+1)]
for i in range(m):
u,v = map(int,input().split())
graph[u].append(v)
graph[v].append(u)
def dfs (graph,i,visited):
visited[i] = True
for k in graph[i]:
if not visited[k]:
dfs(graph, k ,visited)
cnt = 0
for k in nodes:
if visited[k] == True:
continue
dfs(graph,k,visited)
cnt += 1
print(cnt)
리스트 자료구조로 Stack을 구현하여 DFS 탐색
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
graph = [[] for _ in range(n+1)]
visited = [False] * (n+1)
nodes = [n for n in range(1,n+1)]
stack = []
for i in range(m):
u,v = map(int,input().split())
graph[u].append(v)
graph[v].append(u)
cnt = 0
stack = []
for k in nodes:
if visited[k] == True:
continue
stack.append(k)
visited[k] = True
while stack != []:
top = stack.pop()
for i in graph[top]:
if not visited[i]:
stack.append(i)
visited[i] = True
cnt += 1
print(cnt)
세 줄 요약
1. sys.setrecursionlimit(10**6)은 재귀 함수의 깊이 한계를 늘려준다. DFS를 재귀함수로 구현할 때 꼭 사용하자.
2. 리스트 자료구조로 Stack을 구현하여 DFS 탐색을 할 수 있다.
3. is와 ==은 다르다. is는 Object를 비교하고 ==는 value를 비교한다.
+) DFS든 BFS든 stack 또는 Queue에 들어가는 순간 이미 방문 확정이다. 이때 반드시 바로 방문처리를 해야 한다.
728x90
'CodingTest > 문제풀이' 카테고리의 다른 글
| [백준] 2644번 촌수계산 - DFS (Python3) (0) | 2023.12.28 |
|---|---|
| [백준] 13023번 ABCDE - DFS 풀이 + 반례 (Python3) (0) | 2023.12.27 |
| [백준] 4963번 섬의 개수 - BFS 풀이 (Python3) (2) | 2023.12.27 |
| [백준] 1012번 유기농 배추 - BFS 풀이(Python3) (0) | 2023.12.24 |
| [백준] 16956번 늑대와 양 - Python3 (애드 혹 문제, 이 문제가 정말 BFS 문제 일까?) (1) | 2023.12.24 |