[Swift] Breadth-First Search / BFS
2023. 2. 27. 01:02ㆍ🐣/Algorithm
BFS (Breadth-First Search)
인접한 노드를 먼저 탐색하는 방식.
O(Vertex+Edge)

A→B→C→D→E→F→G→H
해당하는 그래프는 아래와 같이 인접 리스트로 나타낼 수 있다.
let graph: [String: [String]] = [ "A" : ["B", "C"], "B" : ["A", "D", "E"], "C" : ["A", "F", "G"], "D" : ["B"], "E" : ["B", "F", "H"], "F" : ["C", "E", "G"], "H" : ["E"] ]
너비 우선 탐색은 보통 두 개의 큐로 구현
방문 해야하는 needVisitQueue
방문 한 노드를 저장하는 visitedQueue
1. 처음으로 탐색할 노드의 데이터를 needVisitQueue에 삽입.
visitedQueue = [] needVisitQueue = ["A"]
2. needVisitQueue의 첫번째 값을 추출해서 visitedQueue에 해당 값이 존재하는지 체크.
- 만약 존재한다면 추출된 값은 버리고 그 다음 첫번째 값을 추출해서 해당 값이 존재하는지 체크.
위 과정을 visitedQueue에서 존재하지 않는 값이 나올 때까지 반복
3. 추출된 값이 visitedQueue에 존재하지 않으면, visitedQueue에 추가.
visitedQueue = ["A"] needVisitQueue = []
4. 추출된 값에 연결된 간선들을 모두 needVisitQueue에 추가.
visitedQueue = ["A"] needVisitQueue = ["B", "C"]
- B가 추출되었을 때
visitedQueue = ["A", "B"] needVisitQueue = ["C", "A", "D", "E"]
5. needVisitQueue가 모두 비었을 경우, visitedQueue에 채워진 값들이 BFS를 통해 탐색된 노드들의 순서.
func BFS(_ graph: [String: [String]], _ start: String) -> [String] { var visitedQueue = [String]() var needVisitQueue = [start] while !needVisitQueue.isEmpty { let node: String = needVisitQueue.removeFirst() if visitedQueue.contains(node) { continue } visitedQueue.append(node) needVisitQueue += graph[node] ?? [] } return visitedQueue } print(BFS(graph, "A")) print(BFS(graph, "H"))

'🐣 > Algorithm' 카테고리의 다른 글
[종만북] Divide & Conquer / 분할 정복 (0) | 2023.03.15 |
---|---|
[종만북] Brute Force / 무식하게 풀기 (0) | 2023.03.15 |
[Swift] BackTracking / 백트래킹 / 퇴각검색 (0) | 2023.02.28 |
[Swift] 진수 변환 (0) | 2022.06.14 |
[Swift] 에라토스테네스의 체를 사용한 소수 찾기 / 소수 찾기 / 소수 / Prime number / Prime (0) | 2022.05.07 |