์๋
ํ์ธ์ Foma ๐ ์
๋๋ค!
์ค๋์ ํธ๋ฆฌ๋ฅผ ํ์ํ๋๋ฐ ์ฐ์ด๋ ์๊ณ ๋ฆฌ์ฆ์ธ ๋๋น์ฐ์ ํ์(BFS)์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
BFS๋?
๋๋น ์ฐ์ ํ์์ ๋งน๋ชฉ์ ํ์๋ฐฉ๋ฒ์ ํ๋๋ก ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ ํ ์์ ์ ์ ์ ์ธ์ ํ ๋ชจ๋ ์ ์ ๋ค์ ์ฐ์ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ด ์์ ๋๊น์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ชจ๋ ์ ์ ๋ค์ ๋ํด์๋ ๋๋น ์ฐ์ ๊ฒ์์ ์ ์ฉํ๋ค. ํ๋ฅผ ์ฌ์ฉํด์ผ๋ง ๋ ๋ฒจ ์์๋๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. - ์ํค ๋ฐฑ๊ณผ -
์ฝ๊ฒ ์์ ๋ฅผ ํตํด์ ์ค๋ช ๋๋ฆด๊ฒ์!
์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ง๊ตฌ ์์ ์ธ ๋๋ผ๋ง ์๊ณ ๋ชจ๋ ๋๋ผ์ ๋๋ผ์ ๋์๋ค์ ํ์ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ฒ ์ง๋ง
๋จผ์ ์ง๊ตฌ์ ์๋ ๋๋ผ๋ฅผ ์ผ์ชฝ๋ถํฐ ์ด๋ค ๋์๋ค์ด ์๋์ง ํ์ธํ๊ณ ๋์ด๊ฐ๋ ๋ฐฉ๋ฒ์ DFS์ ๋๋ค.
(ํน์ DFS๋ฅผ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ์ฌ๊ธฐ ์์ ํ์ธํด์ฃผ์ธ์!)
BFS๋ ๋จผ์ ์ง๊ตฌ์์ ์์ํด์ ๋๋น(๊ฐ๋ก)๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํฉ๋๋ค.
์ง๊ตฌ -> ํ๊ตญ -> ๋ฏธ๊ตญ -> ์๊ตญ ... ์์ผ๋ก ํ์์ ํ๋ ๊ฒ์ด์ฃ !
์ฆ, ๋ฃจํธ ๋ ธ๋์์๋ถํฐ ์์ํด ์์ ๊ณผ ์ธ์ ํ ๋ ธ๋๋ฅผ ํ์ํ๊ณ ๊ทธ ์๋ ๋ ๋ฒจ๋ก ๊ฐ๋ ํ์ ๋ฐฉ๋ฒ์ ๋๋ค.
ํ์ํ๋ ์์๋ ์๋์ ๊ฐ์ด ์งํ๋ฉ๋๋ค.
์ฝ๋ ๊ตฌํ
์ด์ ์ฝ๋๋ก ํ์ธํด๋ณผ๊น์?
๋จผ์ ์ ์ ์ ๊ฐฏ์๋ฅผ ์ค์ ํด์ค๋๋ค.
let n:Int = 13
๊ฐ ์ ์ ์ ๋ํ ์ด๋ฆ์ ์์๋๋ก ๋ฃ์ด์ค๋๋ค.
let world = ["์ง๊ตฌ","ํ๊ตญ","๋ฏธ๊ตญ","์๊ตญ","์์ธ","๋ถ์ฐ","๊ด์ฃผ","๋ด์","LA","์์นด๊ณ ","๋ฐ๋","๋งจ์ฒด์คํฐ","๋ฆฌ๋ฒํ"]
์ง๊ตฌ = 0 ,
ํ๊ตญ = 1, ๋ฏธ๊ตญ = 2, ์๊ตญ = 3,
์์ธ = 4, ๋ถ์ฐ = 5, ๊ด์ฃผ = 6,
๋ด์ = 7, LA = 8, ์์นด๊ณ = 9,
๋ฐ๋ = 10, ๋งจ์ฒด์คํฐ = 11, ๋ฆฌ๋ฒํ = 12
๋ก ํด๋น ์ด๋ฆ ์ธ๋ฑ์ค๋ฅผ ์ฐ๊ฒฐ๋ก ์ธํ ํด์ค๋๋ค.
๋ฌด์์๋ก ์ ์ ์ด ์ฐ๊ฒฐ๋ ์ ๋ณด๋ค์ ์ธํ ํด์ค๋๋ค.
let allConnections:[[Int]] = [[0,1],[2,0],[0,3],[4,1],[5,1],[1,6],[2,7],[2,8],[9,2],[3,10],[3,11],[12,3]]
์ ์ ์ ๋ํ ์ฐ๊ฒฐ์ ๋ฐฉ๋ฌธํ๋์ง๋ฅผ ํ์ํ visited ์ด์ค๋ฐฐ์ด๊ณผ
์ ์ ์ ์์๋ค์ ๋ด์ ํ๋ฅผ ๋ง๋ค์ด์ค๋๋ค. (์์ ์ ์ ์ธ 0์ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ฃ์ด์ค๋๋ค.)
var visited:[[Bool]] = Array(repeating: Array(repeating: false, count: n), count: n)
var queue:[Int] = [0]
๋ณธ๊ฒฉ์ ์ผ๋ก BFS๋ฅผ ๊ตฌํํ๋๋ฐ ๊ฐ์ฅ ํต์ฌ์ while๋ฌธ์ ์ด์ฉํด์ ํ๊ฐ ์๋ฌด๊ฒ๋ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ ๊ฒ์ ๋๋ค.
๋จผ์ ๊ฐ์ฅ ํ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์๋ ์ซ์๋ฅผ ๊บผ๋ด์ต๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋ชจ๋ ์ฐ๊ฒฐ ์ค์์ ์ฒซ ๋ฒ์งธ ์ซ์์ ์ฐ๊ฒฐ๋ ์ซ์๋ฅผ ํ์ ๋ด๋๋ฐ
๋ง์ฝ ๋ถ๋ชจ ๋ ธ๋์ด๊ฑฐ๋ ์ธ์ ํ ๋ ธ๋์ผ ๊ฒฝ์ฐ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๊ณ ๋ก visited์ ๊ผญ ์ด ํ์ฌ first์ ์ ์ ๊ฐ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋์ง๋ฅผ ์ฒดํฌํ๊ณ ํ์ง ์์๋ค๋ฉด ํ์ ๋ฃ์ด์ค๋๋ค.
func searchByBFS(queue:inout [Int],visited:inout [[Bool]]) {
while !queue.isEmpty {
let first = queue.removeFirst()
print(world[first])
allConnections.forEach{
if $0[0] == first && !visited[$0[1]][first] {
visited[$0[1]][first] = true
visited[first][$0[1]] = true
queue.append($0[1])
}
if $0[1] == first && !visited[$0[0]][first] {
visited[$0[0]][first] = true
visited[first][$0[0]] = true
queue.append($0[0])
}
}
}
}
์ด๋ ๊ฒ ์คํํ๊ณ ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๋๋น ์ฐ์ ์ผ๋ก ํ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค!
searchByBFS(queue: &queue, visited: &visited)
//์ง๊ตฌ
//ํ๊ตญ
//๋ฏธ๊ตญ
//์๊ตญ
//์์ธ
//๋ถ์ฐ
//๊ด์ฃผ
//๋ด์
//LA
//์์นด๊ณ
//๋ฐ๋
//๋งจ์ฒด์คํฐ
//๋ฆฌ๋ฒํ
์ ์ฒด ์์ค ์ฝ๋
๋๊ธ