# 문제 : https://www.acmicpc.net/problem/2606
from collections import deque
# 백준 2606번 : 바이러스
n = int(input())
m = int(input())
#adjacent 배열로 구현
# computers=[[0]*(n+1) for _ in range(n+1)]
# for _ in range(m):
# a,b = map(int, input().split()) # input한 값들을 int 함수로 바꿔주는 map 함수로 구현
# computers[a][b] = 1
# computers[b][a] = 1
# 풀이 : https://velog.io/@wjdtmdgml/%EB%B0%B1%EC%A4%80%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A42606%EB%B2%88Python%ED%8C%8C%EC%9D%B4%EC%8D%ACBFS
#adjacent 리스트로 구현
computers = [[] for _ in range(n+1)] # [[]*(n+1)]이랑 다름!
visited = [0]*(n+1)
for _ in range(m):
a,b = map(int,input().split())
computers[a].append(b)
computers[b].append(a)
# 풀이 : https://hei-jayden.tistory.com/103
# BFS로 구현 (방문처리 배열, deque)
def BFS(computers, start):
queue = deque()
queue.append(start)
count = 0
while queue:
now = queue.popleft()
visited[now] = 1
for i in computers[now]:
if visited[i] == 0:
visited[i] = 1
queue.append(i)
count += 1
print(count)
BFS(computers,1)
코딩 테스트를 준비하고자 가장 비중이 많다고 하는 BFS와 DFS를 공략해보려고 하였다.
하지만 프로그래머스의 레벨2 문제에 벽을 느끼고 만 나머지 기초문제 부터 차근차근 풀기로 결정했다;;
사실 BFS의 개념은 알고 있었으나 이를 어떠한 경우에 사용해야 하며, 이것을 구현하는 원리도 알지 못했다.
이번 문제를 풀면서(사실상 푼건 아니고 해설을 보고 공부함) BFS에 필요한 것들이 무엇인지 알 수 있었다.
BFS를 구현하기 위해 필요한 것
- 방문처리를 할 visited 리스트
- 노드의 값을 저장할 행렬 혹은 리스트
이때 노드를 저장하는 방법으로는 행렬과 리스트가 있으나 둘 다 장단점이 있다.
출처 : https://ghkvud2.tistory.com/4?category=826403
BFS와 DFS의 기초 개념 -2
오늘은 BFS와 DFS의 기초 개념부터 차근차근 설명하려고 합니다. (해당 포스트는 BFS와 DFS의 개념을 모르는 초보분들을 초점으로한 포스팅입니다.) 2019/02/11 - [알고리즘 이론] - BFS와 DFS의 기초 개념
ghkvud2.tistory.com
이 분의 글에 특징들이 알기 쉽게 정리되어 있다. (필자도 덕분에 이해하는데 도움이 되었던 자료이다)
또한 코드에서 알 수 있듯이 visited나 computers(노드의 값을 저장하는 리스트)의 크기가 n+1인 이유는
해당 노드의 번호를 인덱스 값과 일치시키기 위해서이다.
인덱스는 0부터 시작하므로 노드의 번호와 일치하지 않기 때문에 n+1을 통해 값을 일치시키면 코드 작성에 더 편하다.
이차원 배열 생성할 때
- computers = [[] for _ in range(n+1)] (O)
- computers = [[] * (n+1)] (X : IndexError 발생, 결과 값 = [ [ ] ])
'CS > 알고리즘' 카테고리의 다른 글
해쉬) 프로그래머스 : 완주하지 못한 선수 / 폰켓몬 (0) | 2022.11.26 |
---|---|
백준 2667번 : 단지 번호 (0) | 2022.06.15 |
알고리즘의 복잡도 (Complexity of Algorithms) (0) | 2022.04.20 |
재귀 알고리즘(recursive algorithms) (0) | 2022.04.17 |
정렬(sort)과 탐색(search) (0) | 2022.04.16 |