일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- 아스테리스크 #Asterisk #파이썬
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- dfs #python #leetcode #combination
- 파이썬 #zip
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- leetcode #subsets #dfs #itertools #python
- 코틀린 #Do it #깡샘 #안드로이드
- 2004 #조합 0의 개수 #백준
- gcd #최대공약수 #백준 #2981 #검문
- python #백준 #9375 #패션왕 #신해빈
- dfs #leetcode #python #graph #그래프
- dfs #그래프 #graph #python #leetcode #course #schedule
- dfs #leetcode #python
- dfs #bfs #이진트리 #파이썬 #리트코드
- final #java #자바 #안드로이드
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- dfs #python #leetcode
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- 리트코드 #팰린드롬 #파이썬
- dfs #bfs #leetcode #python
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- leetcode #python #dfs #재귀
- Python #leetcode #dfs #그래프 #백트래킹
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- Today
- Total
멋진 개발자가 되고 싶다
[LeetCode/Python] 1260. DFS와 BFS 본문
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
아 존나 어렵다.
일단 문제 이해를 못하고 접근했었다.
탐색을 시작할 정점 V가 주어지는데 거기서부터 시작해서 접근하면 되지
V에서 시작해서 접근할 수 없는 곳은 고려 안 해도 된다.
하지만 난 거기까지 고려해야 되는 줄 알고 삽질 존나 함.
dfs는 "깊이 우선 탐색"
bfs는 "너비 우선 탐색"
을 의미한다.
자세한 건 구글링 해보시고~
코드 리뷰부터 시작한다.
1. dfs를 스택으로 구현
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import sys
import collections
def dfs(_graph, start):
visited = []
stack = [start]
while stack:
node = stack.pop()
if node not in visited:
print(node, end=' ')
visited.append(node)
if node not in _graph:
return
stack += sorted(_graph[node], reverse=True)
return
def bfs(_graph, start):
visited = []
queue = collections.deque([start])
while queue:
node = queue.popleft()
if node not in visited:
print(node, end=' ')
visited.append(node)
if node not in _graph:
return
queue += sorted(_graph[node])
return
N, M, V = map(int, sys.stdin.readline().split())
grid = {}
for _ in range(M):
a, b = map(int, sys.stdin.readline().split())
if a in grid:
grid[a].append(b)
else:
grid[a] = [b]
if b in grid:
grid[b].append(a)
else:
grid[b] = [a]
for value in grid.values():
value.sort()
dfs(grid, V)
print()
bfs(grid, V)
|
cs |
해설:
dfs를 스택으로 구현하든 재귀로 구현하든 간에
조건만 잘 맞춰주면 된다.
stack에 reverse로 정렬한 리스트를 넣어주고
pop을 통해 stack에서 빼주게 되면
깊이 우선 탐색이 가능하게 된다.
문제를 자세히 이해하지 못하면 죽어도 못 푸는 부분이 뭐 나면
"탐색을 시작할 정점 V가 간선에 포함되어 있지 않는 경우"
를 고려하지 않았을 때다.
이렇게 되면 정점 V만 거치고 탐색이 종료되어야 한다.
bfs의 경우
"너비 우선 탐색" 이므로
queue에 차례대로 넣어주고
앞에서부터 탐색을 진행해야 한다.
나머지는 코드를 잘 보고 이해해보시길.
2. dfs를 재귀로 구현
1
2
3
4
5
6
7
8
9
10
11
|
dfs_result = []
def dfs(v):
if v not in dfs_result:
dfs_result.append(v)
else:
return
if v not in grid.keys():
return
for i in sorted(grid[v]):
dfs(i)
|
cs |
해설:
dfs를 재귀로 짜 봤다.
우선 코드가 훨씬 간결한 걸 볼 수 있다.
위에서 강조했던
"탐색을 시작할 정점 V가 간선에 포함되어 있지 않는 경우"
를 고려만 해주면 된다.
재귀로도 짜 보고 스택으로도 짜 보고 다양하게 연습해보자!
'Algorithm Study > leetcode' 카테고리의 다른 글
[LeetCode/Python] 39. 조합의 합(Combination Sum) (0) | 2021.07.28 |
---|---|
[LeetCode/Python] 77. 조합(Combinations) (0) | 2021.07.25 |
[LeetCode/Python] 17. Letter Combinations of a Phone Number (0) | 2021.07.24 |
[LeetCode/Python] 200. 섬의 개수(Number of Islands) (0) | 2021.07.24 |
[LeetCode/Python] 347. 상위 K 빈도 요소(Top K Frequent Elements) (0) | 2021.07.18 |