[๋ฐฑ์ค] (Swift) 1260๋ฒ - DFS์ BFS
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1260
1260๋ฒ: DFS์ BFS
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ
www.acmicpc.net
๋ฌธ์ ํ์ด
https://didu-story.tistory.com/98
[์๊ณ ๋ฆฌ์ฆ] ํ์ ์๊ณ ๋ฆฌ์ฆ DFS, BFS
-- ๋ณธ ํฌ์คํ ์ ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ ์ฑ ์ ์ฐธ๊ณ ํ์ฌ ์์ฑ๋์์ต๋๋ค. 1. DFS Depth First Search, ๊น์ด ์ฐ์ ํ์ ๊ทธ๋ํ์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ ์ฃผ๋ก ์ค
didu-story.tistory.com
- dfs์ bfs ์ฝ๋๋ฅผ ๋ฐ๋ก function์ผ๋ก ๊ตฌ์ฑํด์ ํ์๋ค.
- visited์ True False ๋ก ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ค. ๋จ, DFS๋จผ์ ์ถ๋ ฅํ๊ณ , BFS๋ฅผ ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ BFS์์๋ ๋ฐฉ๋ฌธํ๋ ธ๋๊ฐ true๋ก ๋ฐ๋์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ false๋ก ๋ฐ๊พธ๋ฉด์ ํ์๋ค.
โ๏ธ DFS ๊ตฌํ
func dfs(_ v: Int) {
visited[v] = true
print(v, terminator: " ")
for i in 1..<n+1 {
if visited[i] == false && matrix[v][i] == 1 {
dfs(i)
}
}
}
- v ๋ start ๋ ธ๋์ด๋ค. ๊ทธ๋์ ํ์์ ์์ํ์๋ง์ ๋ ธ๋ v ๋ ๋ฐ๋ก ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํด์ค๋ค.
- ๋ฌธ์ ์์๋ ํ์์ ํ๋ฉด์, ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ์์๋๋ก ์ถ๋ ฅํด์ผํ๋ค. ๊ทธ๋์ ๋ฐ๋ก v๋ฅผ ์ถ๋ ฅํด์ค๋ค.
- print์์ terminator๋ ์ค๋ฐ๊ฟ์ ํ์ง ์๊ณ , "" ์์ ์๋ ๋ฌธ์๋ฅผ ํตํด ์ฐ๊ฒฐ์์ผ์(?) ์ถ๋ ฅํด์ค๋ค.
- ๋ฐ๋ณต๋ฌธ์ ํตํด์ dfs ์ฌ๊ท๋ฅผ ํ์ฉํ ๊ฒ์ด๋ค. (๋ด๊ฐ ๊ทธ๋ํ๋ฅผ ์ด๋ป๊ฒ ๊ทธ๋ ธ๋๋์ ๋ฐ๋ผ ํจ์๊ฐ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค)
- 1๋ถํฐ ์ฐจ๋ก๋๋ก ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ํ๋จํ๋ฉด์ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฐ๋ค.
- ๋ง์ฝ ๋ฐฉ๋ฌธํ์ง ์์๊ณ , ๊ทผ๋ฐ ๊ทธ๊ฒ ์์๋ ธ๋์ ์ฐ๊ฒฐ๋์ด์๋ ๋ ธ๋๋ผ๋ฉด, dfs์ ๋ฃ์ด์ ์ฌ๊ท๋ก ๋๋ ค์ค๋ค.
โ๏ธ BFS ๊ตฌํ
func bfs(_ v: Int) {
var queue: [Int] = []
visited[v] = false // dfs ๋์๊ฐ๋ฉด์ true ๋ก ๋ฐ๋๊ฑฐ false ๋ก ๋๋ฆฌ๋ฉด์ go
queue.append(v)
while !queue.isEmpty {
var newV = queue.removeFirst()
print(newV, terminator: " ")
for i in 1..<n+1 {
if visited[i] == true && matrix[newV][i] == 1 {
queue.append(i)
visited[i] = false
}
}
}
}
- ์ฃผ์ ) ์ด ํจ์์์๋ ๋ฐฉ๋ฌธํ๋ค๋๊ฒ false, ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ true
- ๋จผ์ queue๋ฅผ ๊ตฌ์ฑํด์ฃผ์๋ค. queue๋ ์๋ ํ์ด์ฌ์์ dequeue๋ก ๋ง๋ค์ด์ฃผ๋ฉด์, pop ํ๋ฉด์ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ์ ์๋๋ฐ, ์ค์ํํธ๋ dequeue ๊ธฐ๋ฅ๊ณผ pop ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์์ด์, removeFirst() ๋ก ํด์ผํ๋ค.
- ํ์ง๋ง removeFirst๋ O(n) ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋์ ์๊ฐ์ด๊ณผ๊ฐ ๋์ฌ ์๋ ์๋ค. (ํด๋น ๋ฌธ์ ์์๋ ๋ฐ์ํ์ง ์์์ง๋ง, ์๊ฐ๋ณต์ก๋๊ฐ ๊ฝค๋ ํฌ๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผํ๋ค.)
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ด๋ฉด์, ์ง๊ธ ์ณ๋ค๋ณด๊ณ ์๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด์๋ ๋ ธ๋๋ผ๋ฉด ํ์ ๋์์ด๊ธฐ ๋๋ฌธ์ queue์ ๋ฃ์ด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ๋ค์ ํด์ฃผ๊ณ ,,, ๋ฐ๋ณตํ๋ค.
๐ป ์ ์ฒด์ฝ๋
https://github.com/deslog/Algorithm/blob/main/Algorithm/Boj/1260_DFS%EC%99%80%20BFS/main.swift
GitHub - deslog/Algorithm
Contribute to deslog/Algorithm development by creating an account on GitHub.
github.com
var nmv = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nmv[0]
let m = nmv[1]
let v = nmv[2]
var visited = Array(repeating: false, count: n+1)
var matrix = Array(repeating: Array(repeating: 0, count: n+1), count: n+1)
for i in 0..<m {
let nums = readLine()!.split(separator: " ").map{ Int(String($0))! }
matrix[nums[0]][nums[1]] = 1
matrix[nums[1]][nums[0]] = 1
}
func dfs(_ v: Int) {
visited[v] = true
print(v, terminator: " ")
for i in 1..<n+1 {
if visited[i] == false && matrix[v][i] == 1 {
dfs(i)
}
}
}
func bfs(_ v: Int) {
var queue: [Int] = []
visited[v] = false // dfs ๋์๊ฐ๋ฉด์ true ๋ก ๋ฐ๋๊ฑฐ false ๋ก ๋๋ฆฌ๋ฉด์ go
queue.append(v)
while !queue.isEmpty {
var newV = queue.removeFirst()
print(newV, terminator: " ")
for i in 1..<n+1 {
if visited[i] == true && matrix[newV][i] == 1 {
queue.append(i)
visited[i] = false
}
}
}
}
dfs(v)
print("")
bfs(v)