무수한 상황에서 데이터를 효율적으로 다룰 수 있는 방법
익숙한 자료구조로는 Stack, Queue, Tree, Graph 등이 있다.
탐색은 다양한 알고리즘을 적용하기 좋은 테마 중 하나이다.
추상적일 수 있지만 우리가 맞이하는 다양한 문제 등을 탐색을 통해 해결할 수 있다.
미로게임이, 로봇청소기, 최단 거리 또는 최단 시간 경로 찾기 등이 탐색을 통해서 문제를 해결해 볼 수 있다.
탐색에도 여러 방법이 있겠지만
오늘은 tree, stack, queue 등의 자료구조를 통해 DFS와 BFS를 다루어 보기로 한다.
Javascript로 구현한 BFS 문제 풀이이다.
const bfs = (graph, start, visited = []) => {
let queue = [start]
visited.push(start)
while (queue.length > 0) {
node = queue.shift()
for (value of graph[node]) {
if (!visited.includes(value)) {
queue.push(value)
visited.push(value)
}
}
}
return visited
}
const graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
bfs(graph, 1)
// [ 1, 2, 3, 8, 7, 4, 5, 6 ]
Javascript로 구현한 DFS 문제 풀이이다. Stack과 재귀를 활용하였다.
const dfs_recussion = (graph, start, visited=[]) => {
visited.push(start);
for (node of graph[start]) {
if (!visited.includes(node)) {
dfs_recussion(graph, node, visited)
}
}
return visited
}
const graph = {
'A':['B','C'],
'B':['A','D','E'],
'C':['A','G','H'],
'D':['B'],
'E':['B','F'],
'F':['E'],
'G':['C'],
'H':['C']
}
dfs_recussion(graph, 'A')
// [ 'A', 'B', 'D', 'E', 'F', 'C', 'G', 'H' ]