깊이 우선 탐색(Depth-First Search, DFS)과 너비 우선 탐색(Breadth-First Search, BFS)은 두 가지 널리 쓰이는 그래프 탐색 알고리즘이다.
그래프 탐색의 목적은 그래프 내에서 목표 노드를 찾는 것이다. 이 두가지 모두 사용이 가능한 경우라도 각각의 장단점에 따라 선택하여 문제를 푸는 것이 중요하다.
DFS는 그래프를 깊게 탐색하는 알고리즘이다.
즉, 한놈만 팬다
는 느낌으로 깊게 들어가서 탐색하는 것!
탐색시 시작 노드로부터 방문하지 않은 노드로 가기 위해 스택
을 사용한다.
만약 가장 마지막 깊이까지 방문했다면 스택의 가장 위에 있는 노드로 돌아가
스택의 다른 노드들을 방문한다.
DFS는 깊이 들어가기 때문에 목표 노드를 빠르게 찾을 수 있지만 메모리 사용량이 많이 든다는 단점이 있다.
BFS는 그래프를 넓게 탐색하는 알고리즘이다.
DFS와는 다르게 그래프를 탐색할 때 큐
를 사용한다.
그래프에서 꺼낸 방문하지 않은 노드는 큐에 넣고 방문한 노드는 큐에서 제거된다.
BFS는 메모리 사용량이 DFS보다 적지만 목표 노드를 찾는데 시간이 더 오래 걸린다는 단점이 있다.
DFS
는 목표 노드를 빠르게
찾을 수 있지만 메모리 사용량이 많이
든다.
BFS
는 메모리 사용량
이 DFS보다 적지만
목표 노드를 찾는데 시간이 더 오래
걸린다.
N × M 크기의 얼음 틀이 있다.
0은 얼음칸, 1은 칸막이로 표시한다.
얼음칸끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다.
주어진 얼음 틀에서 생성되는 총 아이스크림의 개수를 구하는 프로그램 작성하기.
한 번에 만들 수 있는 아이스크림의 개수를 출력한다.
입력 예시 1
4 5 00110 00011 11111 00000
출력 예시 1
3
입력 예시 2
15 14 00000111100000 11111101111110 11011101101110 11011101100000 11011111111111 11011111111100 11000000011111 01111111111111 00000000011111 01111111111000 00011111111000 00000001111000 11111111110011 11100011111111 11100011111111
출력 예시2
8
dfs
로 탐색한다.dfs
함수 내에서 범위 안에 있고 방문되지 않은 노드를 모두 탐색한다. => if graph[x][y] == 0
graph[x][y] = 1
0
이 없다면 return false
로 재귀 함수들을 종료한다.dfs
함수가 true
로 반환될 때 뭉쳐있는 한 덩어리를 모두 방문했으므로 result += 1
로 count한다.import Foundation
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let (n, m) = (input[0], input[1])
var graph = [[Int]]()
for _ in 0 ..< n {
graph.append(readLine()!.map { Int(String($0))! })
}
func dfs(_ x: Int, _ y: Int) -> Bool {
// 범위 벗어나면 종료
if !isInRange(x, y) {
return false
}
if graph[x][y] == 0 { // 방문하지 않은 노드
graph[x][y] = 1 // 방문처리
// 상하좌우 탐색
dfs(x - 1, y)
dfs(x, y - 1)
dfs(x + 1, y)
dfs(x, y + 1)
return true // 주변이 다 막혀있다면 true 반환하고 종료
}
return false
}
func isInRange(_ x: Int, _ y: Int) -> Bool {
return (0..<n ~= x) && (0..<m ~= y)
}
var result = 0
for i in 0 ..< n {
for j in 0 ..< m {
if dfs(i, j) {
result += 1
}
}
}
print(result)