์๋ ํ์ธ์ Foma ๐ ์ ๋๋ค!
์ค๋์ ๊ทธ๋ํ ๋ฌธ์ ์์ ์์ฃผ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ๋ค์ต์คํธ๋ผ๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์!
๋ค์ต์คํธ๋ผ๋? ๐ค
๋๋ฌด ์ํค์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด์์ต๋๋ค.
"์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ํ ์ ์ ์์ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค."
์ฝ๊ฒ ๋งํ๋ฉด ํ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก ์ด๋ํ ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ธธ์ ์ฐพ์์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด์์.
๊ทธ๋ํ ์ค๋ช
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์์ ์ ์ ์ 1๋ก ๋ชฉํ ์ ์ ์ 4๋ก ๋์์ ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ ๋ช์ผ๊น์?
1 - 5 - 4 ๋ก ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ 3 + 1 = 4๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๊ธธ์ด๊ฒ ์ฃ ?
์ด๋ ๊ฒ ๊ฐ๋จํ ๋ณด์ด๋ ๊ฒฝ๋ก๋ ๋์ผ๋ก ์ฝ๊ฒ ์ฐพ์ ์ ์์ง๋ง ๋ณต์กํ ๊ฒฝ๋ก์ผ์๋ก ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์์ง ๊ฒ์ ๋๋ค.
์ด ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ ๊ฒ์ธ๋ฐ์.
์์ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก ๊ฐ๋ ๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณค ์์ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ก ์ ๋ฐ์ดํธ ํด์ค๋๋ค
.
์์ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ํํ๋ฉด์ ๋ ์งง์ ๊ฑฐ๋ฆฌ๋ก ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
1๋ฒ๊ณผ ์ฐ๊ฒฐ๋ 2๋ฒ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ์ํํ๋ฉด์ 2๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒ๊ณผ 1๋ฒ์์ ์ง์ ๊ฐ๋ ๊ฒ์ ๋น๊ตํ์ฌ
๋ ์งง์ ๊ฑฐ๋ฆฌ๋ก ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ์ฌ ์์ ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก ๊ฐ๋ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
์ฝ๋ ์ค๋ช
์๋์ ๊ฐ์ด ์ ์ ์ ๊ฐฏ์, ์์ ์ ์ ,์ฐ๊ฒฐ ์ ๋ณด,๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ๋ฐฐ์ด,๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค๋๋ค.
//์ ์ ์ ๊ฐฏ์
var n = 5
//์์ ์ ์
var start = 1
//์ฐ๊ฒฐ๋ ์ ๋ณด
var connections = [[1,2,1],[1,3,19],[1,4,10],[1,5,3],[2,3,30],[2,4,2],[2,5,7],[3,4,26],[3,5,4],[4,5,1]]
//๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
var allRoutes = (0...n).map{[$0]}
//๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด(์ด๊ธฐ ๊ฐ์ Int์ ์ต๋๊ฐ์ผ๋ก ์ค์ )
var allDistances = Array(repeating: Int.max, count: n+1)
๋ค์๊ณผ ๊ฐ์ด ๋ค์ต์คํธ๋ผ ํจ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๋จผ์ ์์ ์ ์ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ 0์ผ๋ก ์ค์ ํ๊ณ
ํ์ while๋ฌธ์ ์ด์ฉํด์ ๊ฐ ์ ์ ๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ BFS ๋ฐฉ์์ผ๋ก ์ํํด์ค๋๋ค.
๋ง์ฝ ์ค๊ฐ์ ๊ฑฐ์ณ์ ๊ฐ๋ ๊ฒ์ด ์ง์ ๊ฐ๋ ๊ฒ๋ณด๋ค ๊ฑฐ๋ฆฌ๊ฐ ์งง๋ค๋ฉด allDistances์ ๊ฑฐ๋ฆฌ์ allRoutes์ ๊ฒฝ๋ก๋ฅผ ์๋กญ๊ฒ ๋ฐ๊ฟ์ค๋๋ค.
//๋ค์ต์คํธ๋ผ๋ก ์์ ์ ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ก ์
๋ฐ์ดํธํด์ค.
func dijkstra() {
//์๊ธฐ ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ 0
allDistances[start] = 0
//์์ ์ธ๋ฑ์ค๋ฅผ ๋ด์ ํ๋ฅผ ๋ง๋ค์ด์ค.
var queue:[Int] = [start]
//ํ๊ฐ ๋ชจ๋ ์์ด์ง๋๊น์ง ๋ฐ๋ณต
while !queue.isEmpty {
//ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ ์ฅํ๋ฉด์ ์ญ์ ํด์ค.
let first = queue.removeFirst()
//์ฐ๊ฒฐ ์ ๋ณด์์ ํ์ ์ฒซ๋ฒ์งธ ๊ฐ์ด ์๋ ๊ฒ๋ค๋ก ํํฐ๋ง ํด์ค.
let filterNodes = connections.filter{$0[0] == first || $0[1] == first}
//ํํฐ๋งํ ๊ฒ๋ค์ ์ํ
for node in filterNodes {
//์ฒซ๋ฒ์งธ ๊ฐ์ด ์๋ ๊ฒ์ other๋ก ์ค์
let connectionNode = node[0] == first ? node[1] : node[0]
//๋ง์ฝ Int ์ต๋๊ฐ์ด๋ผ๋ฉด continue
if allDistances[first] == Int.max {continue}
//์ฒซ๋ฒ์งธ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฒ์ด ์๋ ์๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด
if allDistances[first]+node[2] < allDistances[connectionNode] {
//์ฒซ๋ฒ์งธ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฒ์ผ๋ก ์
๋ฐ์ดํธ
allDistances[connectionNode] = allDistances[first]+node[2]
//์ฒซ๋ฒ์งธ ํ์ ์๋ ๋ฃจํธ๋ฅผ ์ ์ฅํจ.
var newRoute = allRoutes[first]
//ํ์ฌ ๋
ธ๋๋ฅผ ์ถ๊ฐํด์ค.
newRoute.append(connectionNode)
//ํ์ฌ ๋
ธ๋๋ฅผ ์๋ก์ด ๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ค.
allRoutes[connectionNode] = newRoute
//ํ์ฌ ๋
ธ๋๋ฅผ ํ์ ๋ฃ์ด์ค.
queue.append(connectionNode)
}
}
}
}
์ด๋ ๊ฒ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์คํํด์ฃผ๋ฉด ์๋์ ๊ฐ์ด allDistances์ 1์์ ๊ฐ ์ ์ ๋ณ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๊ฐ ๋ด๊ฒจ์๊ณ
allRoutes์ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ก ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์์๋๋ก ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค!
dijkstra()
print(allDistances) //[9223372036854775807, 0, 1, 7, 3, 3]
print(allRoutes) //[[0], [1], [1, 2], [1, 5, 3], [1, 2, 4], [1, 5]]
๊ด๋ จ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฐ๋ฌ
ํ๋ก๊ทธ๋๋จธ์ค ๊ฐ์ฅ ๋จผ ๋ ธ๋
๋๊ธ