์๋ ํ์ธ์ Foma ๐ ์ ๋๋ค!
์ค๋์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ์์ฒญ ๋น๋ฒํ๊ฒ ์ถ์ ๋๊ณ ์์๋๋ฉด ์ ๋ง ์ ์ฉํ DFS์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์!
DFS๋?
"๊น์ด ์ฐ์ ํ์์ ๋งน๋ชฉ์ ํ์ ๋ฐฉ๋ฒ์ ํ๋๋ก ํ์ํธ๋ฆฌ์ ์ต๊ทผ์ ์ฒจ๊ฐ๋ ๋ ธ๋๋ฅผ ์ ํํ๊ณ , ์ด ๋ ธ๋์ ์ ์ฉ ๊ฐ๋ฅํ ๋์์ ์ค ํ๋๋ฅผ ์ ์ฉํ์ฌ ํธ๋ฆฌ์ ๋ค์ ์์ค์ ํ ๊ฐ์ ์์๋ ธ๋๋ฅผ ์ฒจ๊ฐํ๋ฉฐ, ์ฒจ๊ฐ๋ ์์ ๋ ธ๋๊ฐ ๋ชฉํ๋ ธ๋์ผ ๋๊น์ง ์์ ์์ ๋ ธ๋์ ์ฒจ๊ฐ ๊ณผ์ ์ ๋ฐ๋ณตํด ๊ฐ๋ ๋ฐฉ์์ด๋ค." - ์ํค ๋ฐฑ๊ณผ -
์ด๊ฒ ๋ญ๋ง์ด์ผ....;;;
์ฝ๊ฒ ์์ ๋ฅผ ํตํด์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ง๊ตฌ ์์ ์ธ ๋๋ผ๋ง ์๊ณ ๋ชจ๋ ๋๋ผ์ ๋๋ผ์ ๋์๋ค์ ํ์ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ด๋ค ์ฌ๋์ "๋ ๋จผ์ ์ด๋ค ๋๋ผ๋ค์ด ์๋์ง ๋ถํฐ ํ์ธํ๊ณ ๊ทธ ๋๋ผ ์์ ์๋ ๋์๋ค์ ํ์ธํ ๋" ๋ผ๊ณ ํ ์ ์๊ณ
์ด๋ค ์ฌ๋์ "๋ ๋จผ์ ํ ๋๋ผ๋ถํฐ ๋ชจ๋ ๋์๋ฅผ ํ์ธํ๊ณ ๊ทธ ๋ค์ ๋๋ผ๋ก ๋์ด๊ฐ๋" ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ด ๋ ์ค์ DFS๋ ์ด๋ค ๊ฒ ์ผ๊น์?
๋ฐ๋ก ๋ ๋ฒ์งธ ๋ฐฉ์์ ๋๋ค. (์ฒซ ๋ฒ์งธ ๋ฐฉ์์ BFS ์ ๋๋ค.)
์ง๊ตฌ -> ํ๊ตญ -> ์์ธ ์ด ์์๋๋ก ๊ฐ ์ ์ ์ ๊น์ด๋ฅผ ๋จผ์ ํ์ธํ์ฃ ?
๋ฐ๋ก ์ด๊ฒ์ ๊น์ด๋ฅผ ์ฐ์ ํ์ํ๋ค. ์ฆ, ๊น์ด ์ฐ์ ํ์ DFS ๋ฐฉ์์ ๋๋ค.
๋ง์ฝ ์์ธ ์์ ๊ตฌ๊น์ง ์์๋ค๋ฉด ์๋ ์ฌ์ง์ฒ๋ผ ์ ์ ๋ ๊น๊ฒ ํ์ธํ๋ค๊ฐ ๋ ์ด์ ์์์ด ์๋ ๊ฒฝ์ฐ์
๊ฐ๋จ -> ๋งํฌ -> ์ํ ์(๋๋น)์ผ๋ก ํ์ธํ๋ ๊ฒ์ด์ฃ .
ํ์ํ๋ ์์๋ ์๋์ ๊ฐ์ด ์งํ๋ฉ๋๋ค.
๋ณดํต ์ฌ๊ทํธ์ถ๋ก ๊ตฌํํ์ง๋ง ๋จ์ํ๊ฒ ์คํ์ผ๋ก ๊ตฌํํ ์ ๋ ์์ต๋๋ค.
์ฝ๋ ๊ตฌํ
์ด์ ์ฝ๋๋ก ํ์ธํด๋ณผ๊น์?
๋จผ์ ์ ์ ์ ๊ฐฏ์๋ฅผ ์ค์ ํด์ค๋๋ค.
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],
[3,7],
[3,8],
[9,3],
[2,10],
[2,11],
[12,2]
]
๊ฐ ์ธ๋ฑ์ค์ ์์๋ค์ด ๋ด๊ธฐ๋๋ก n ํฌ๊ธฐ์ ์ด์ค๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
var parentChildren:[[String]] = Array(repeating: [], count: n)
์ต๋ ์ฐ๊ฒฐ๋ ์ ์๋ n*n ํฌ๊ธฐ์ ์ด์ค ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
var connections[[Bool]] = Array(repeating: Array(repeating: false, count: n), count: n)
๊ทธ๋ฆฌ๊ณค ์์ connections์์ ์๋ก ์ฐ๊ฒฐ๋์ด ๋ ์ ์ ์ true๋ก ๋ฐ๊ฟ์ค๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ๋ค๋ง true๋ก ๋๊ฒ ์ฃ ?
func setConnections() {
for connection in allConnections {
let left = connection[0]
let right = connection[1]
connections[left][right] = true
connections[right][left] = true
}
}
for๋ฌธ์ ์ด์ฉํด์ ํ์ฌ ์ ์ ๊ณผ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ๋น๊ตํฉ๋๋ค.
์ด ์ค ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ค ๋ถ๋ชจ๊ฐ ์๋ ์ ์ ์ ์์์ด๋ ์๋ฏธ์ด๋ฏ๋ก
parentChildren์ ํ์ฌ ์ ์ ์ธ๋ฑ์ค ๋ฐฐ์ด์ ์ฐ๊ฒฐ๋ ์ ์ ์ ์์์ผ๋ก ์ถ๊ฐํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋ถ๋ชจ๋ฅผ ํ์ฌ ์ ์ ์ผ๋ก ํ์ฌ๋ฅผ ์ฐ๊ฒฐ๋ ์ ์ ์ผ๋ก ์ฌ๊ทํด์ค๋๋ค.
func searchByDFS(parent:Int,current:Int) {
connections[current]
.enumerated()
.filter{$0.element == true && $0.offset != parent}
.forEach {
parentChildren[current].append(world[$0.offset])
searchByDFS(parent: current, current: $0.offset)
}
}
๋ชจ๋ ์ฐ๊ฒฐ์ ํ๊ณ ์ ์ 0๋ถํฐ DFS๋ฅผ ์คํ ์์ผ์ค ๋ค parentChildren์ ๊ฐ ์ธ๋ฑ์ค ๋ณ ์์๋ค์ ํ์ธํด๋ณด๋ฉด
[["ํ๊ตญ", "๋ฏธ๊ตญ", "์๊ตญ"], ["์์ธ", "๋ถ์ฐ", "๊ด์ฃผ"], ["๋ด์", "LA", "์์นด๊ณ "], ["๋ฐ๋", "๋งจ์ฒด์คํฐ", "๋ฆฌ๋ฒํ"], [], [], [], [], [], [], [], [], []]
์์ ๊ฐ์ด ๊ฐ ์ ์ ์ ๋ํ ์์๋ค์ด ์ ์ฅ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
setConnections()
searchByDFS(parent: 0, current: 0)
print(parentChildren)
for (i,children) in parentChildren.enumerated(){
print("\(world[i])์ ์์์ \(children)")
}
/*
[["ํ๊ตญ", "๋ฏธ๊ตญ", "์๊ตญ"], ["์์ธ", "๋ถ์ฐ", "๊ด์ฃผ"], ["๋ด์", "LA", "์์นด๊ณ "], ["๋ฐ๋", "๋งจ์ฒด์คํฐ", "๋ฆฌ๋ฒํ"], [], [], [], [], [], [], [], [], []]
์ง๊ตฌ์ ์์์ ["ํ๊ตญ", "๋ฏธ๊ตญ", "์๊ตญ"]
ํ๊ตญ์ ์์์ ["์์ธ", "๋ถ์ฐ", "๊ด์ฃผ"]
๋ฏธ๊ตญ์ ์์์ ["๋ด์", "LA", "์์นด๊ณ "]
์๊ตญ์ ์์์ ["๋ฐ๋", "๋งจ์ฒด์คํฐ", "๋ฆฌ๋ฒํ"]
์์ธ์ ์์์ []
๋ถ์ฐ์ ์์์ []
๊ด์ฃผ์ ์์์ []
๋ด์์ ์์์ []
LA์ ์์์ []
์์นด๊ณ ์ ์์์ []
๋ฐ๋์ ์์์ []
๋งจ์ฒด์คํฐ์ ์์์ []
๋ฆฌ๋ฒํ์ ์์์ []
*/
์ ์ฒด ์ฝ๋
๊ด๋ จ ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค ์ฌํ ๊ฒฝ๋ก
ํ๋ก๊ทธ๋๋จธ์ค ๋คํธ์ํฌ
ํ๋ก๊ทธ๋๋จธ์ค ๋ชจ๋ 0์ผ๋ก ๋ง๋ค๊ธฐ
๋๊ธ