You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
스택의 최상단에 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문처리. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
2번의 과정을 수행할 수 없을 때까지 반복
소스 코드
letgraph:[[Int]]=[[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]varvisited:[Bool]=Array(repeating: false, count:9)func dfs(v:Int){visited[v]= true
print(v, terminator:"")
for n in graph[v]{
if !visited[n]{dfs(v: n)}}}dfs(v:1)
// 1 8 7 6 3 5 4 2
BFS(Breadth-First Search)
너비 우선 탐색, 가까운 노드부터 우선적으로 탐색하는 알고리즘
큐 자료구조를 이용
탐색 시작 노드를 큐에 삽입하고 방문처리
큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
더 이상 2번의 과정을 수행할 수 없을 때까지 반복
소스 코드
letgraph:[[Int]]=[[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]varvisited:[Bool]=Array(repeating: false, count:9)func bfs(v:Int){varqueue:[Int]=[v]visited[v]= true
while !queue.isEmpty {letnode:Int= queue.removeFirst()print(node, terminator:"")
for next in graph[node]{
if !visited[next]{
queue.append(next)visited[next]= true
}}}}bfs(v:1)
// 1 2 7 6 8 3 4 5
음료수 얼려 먹기
/*
Swift
*/
letNM:[Int]=readLine()!
.split(separator:"").map{Int($0)! }letN:Int=NM[0]letM:Int=NM[1]letdx:[Int]=[1,-1,0,0]letdy:[Int]=[0,0,-1,1]vargraph:[[Int]]=[]varisVisited:[[Bool]]=Array(
repeating:Array(repeating: false, count: M),
count: N
)
for _ in 0..<N {letinput:[Int]=Array(readLine()!).map{Int(String($0))! }
graph.append(input)}func dfs(x:Int, y:Int){isVisited[x][y]= true
for i in dx.indices {letnx:Int= x + dx[i]letny:Int= y + dy[i]
guard 0..<N ~= nx && 0..<M ~= ny &&
graph[nx][ny]==0 &&
!isVisited[nx][ny]else{ continue }dfs(x: nx, y: ny)}}varcount:Int=0
for i in 0..<N {
for j in 0..<M {
if isVisited[i][j] || graph[i][j]==1{ continue }dfs(x: i, y: j)
count +=1}}print(count)