๋ฐ์ํ
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1260
๋ฌธ์ ํ์ด
https://didu-story.tistory.com/98
- 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
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)
๋ฐ์ํ
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 11724๋ฒ - ์ฐ๊ฒฐ ์์์ ๊ฐ์ (DFS ์ฐ์ต) (0) | 2022.05.20 |
---|---|
[๋ฐฑ์ค] (Swift) 14501๋ฒ - ํด์ฌ (DP๋ก ํ๊ธฐ) (0) | 2022.05.17 |
[๋ฐฑ์ค] (Swift) 1759๋ฒ - ์ํธ ๋ง๋ค๊ธฐ (0) | 2022.05.10 |
[๋ฐฑ์ค] (Swift) 15654๋ฒ - N๊ณผ M (5) (DFS๋ก ํ๊ธฐ!) (0) | 2022.05.04 |
[๋ฐฑ์ค] (Swift) 15651๋ฒ - N๊ณผ M (3) (5) | 2022.04.25 |