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 |
Tags
- 노드개발자
- SWEA
- 노드프로젝트
- 1260
- DFS
- 노드개발
- 프로그래머스
- 너비우선탐색
- 백준 2667
- Python
- 코테
- 코딩
- 코딩테스트
- 이메일인증
- 파이썬
- 앱개발
- 알고리즘
- 백준
- 브실이의입시전략
- 자바
- BFS
- nodejs
- Gmail인증
- springboot
- 깊이우선탐색
- 쪽지기능
- Java
- static final
- email인증
- 실버5
Archives
- Today
- Total
데옹의 블로그
[Python/파이썬] 백준 1260 : DFS와 BFS 본문
DFS와 BFS를 공부 중인데,
이론적으로 이해하는 건 되지만 계속 헷갈려서 코드만 정리하면서 써보려구요.
갑니다.. 더 친절한 설명을 원하면 다른 블로그를 참고해주세요!
from collections import deque
from sys import stdin
input = stdin.readline
# 입력을 받는 곳입니다.
n,m,v = map(int, input().split())
# 1. 그래프 초기화
## 인덱스를 1부터 시작하기 위해서 n+1 을 해줍니다.
## 일반적으로 그래프의 노드 번호는 1부터 시작하는 경우가 많습니다.
## n은 실제 노드의 개수이고, 노드의 번호는 1부터 n까지이니 리스트의 크기를 n+1로 설정하여
## 인덱스 1부터 n까지 사용할 수 있도록 초기화를 한 것입니다.
### 이렇게 하면 노드와 인덱스를 일치시킬 수 있습니다.
### 더 많은 설명은 아래에 첨부하겠습니다.
graph = [[0]*(n+1) for _ in range(n+1)]
# 2. 방문 여부 초기화
dfs_visited = [False] * (n+1)
bfs_visited = [False] * (n+1)
# 3. 그래프 정보 입력
for _ in range(m):
x, y = map(int, input().split())
graph[x][y] = 1
graph[y][x] = 1
# 깊이 우선 탐색 함수
def dfs(v):
dfs_visited[v] = True # 현재 노드를 방문 처리
print(v, end=' ') # 현재 노드 출력
for i in range(1,n+1):
# 방문하지 않았고, 연결된 노드라면 재귀로 호출합니다.
## not visited : 방문하지 않은 노드라면?
## graph[v][i] == 1 : 연결이 되어있다면?
### 연결된 부분은 위에서 graph[][] = 1 로 할당해주었잖아요!
if not dfs_visited[i] and graph[v][i] == 1:
dfs(i)
# 너비 우선 탐색 함수
def bfs(v):
bfs_visited[v] = True # 현재 노드를 방문 처리
queue = deque()
queue.append(v) # 큐에 현재 노드를 추가합니다. QUEUE, NOT STACK!!
while queue:
popv = queue.popleft() # 큐에서 노드를 하나 꺼내와 popv에 할당. (처음 들어간 게 나오겠죠)
print(popv, end=' ') # 꺼내온 노드 출력
for i in range(1,n+1):
# 방문하지 않았고, 연결된 노드라면 큐에 추가하고 방문 처리를 합니다.
## 조건은 위에 dfs와 같습니다.
## 하지만, append를 통해 큐에 추가해주죠 (추가된 노드에 연결된 노드를 나중에 확인해야 하니까요)
if not bfs_visited[i] and graph[popv][i] == 1:
queue.append(i)
bfs_visited[i] = True
dfs(v)
print()
bfs(v)
코드를 보고 헷갈렸던 부분은 1번으로 적어놓은 graph와 visited를 설정할 때 입니다.
저렇게 코드를 써두면,
node의 개수 즉, n이 3일 때! graph와 visited는 각각
graph = [0, [0,0,0], [0,0,0], [0,0,0]]
visited = [False, False, False, False]
가 되는 것입니다. 이렇게 설정하면 각 리스트의 맨 앞은 사용하지 않고
1번 노드와 2번 노드가 연결되어 있다면
graph[1][2] = 1, graph[2][1] = 1 처럼 간편하게 알아볼 수 있고,
visited 도 그냥 1번 노드 방문했었나? 하면
visited[1]을 확인하면 끝나는 것이죠.
이 부분을 직접 돌려보며 계속 이해하려고 노력했고, 후에 공부할 때 도움이 잘 되었던 것 같습니다. (이해하는데..)
끝!
'python' 카테고리의 다른 글
[Python] 프로그래머스 - 공원 산책 [level 1] (0) | 2024.01.12 |
---|---|
[Python] 프로그래머스 - 튜플 (level 2) (2) | 2023.11.09 |
[SWEA] 19003. 펠린드롬 문제(D3) (8) | 2023.11.08 |
[Python/파이썬] 백준 2667 : 단지번호붙이기 (+ 전 코드 리뷰) (0) | 2023.06.19 |
[Python/파이썬] 백준 2606 : 바이러스 (0) | 2023.06.18 |