
Problem
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ๋ฐฐ๋ฌ
5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4
programmers.co.kr
Solution
ํด๋น ๋ฌธ์ ๋ ํ ์ ์ ์์์ ๊ฑฐ๋ฆฌ๋ง ๊ตฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ค.
(ํ๋ก์ด๋๋ก ํ๋ฉด ํจ์จ์ ์ด์ง ์์ง๋ง ํ๋ฆฌ๊ธด ํ๋ฆฐ๋ค...)
๋ค์ต์คํธ๋ผ ํ์ด
1.๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ์ด์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค.
(allDistances ๋ณ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
2.๋ค์ต์คํธ๋ผ๋ก ์์ํ๋ ์ ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์์ค.
(dijkstra ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
4.1๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ค ์ฃผ์ด์ง ์๊ฐ ์ดํ์ธ ๊ฒ์ ์ฐพ์
(findEnableDelivery ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
ํ๋ก์ด๋ ์์ฌ ํ์ด
1.๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ์ด์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค.
(allDistances ๋ณ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
2. road์ ์๋ ์ ๋ณด๋ฅผ allDistances์ ๋ฃ์ด์ค
(setConnections ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
3.floyd warshall๋ก ๊ฐ ์ ์ ์์ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์
(floyd ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
4.1๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ค ์ฃผ์ด์ง ์๊ฐ ์ดํ์ธ ๊ฒ์ ์ฐพ์
(findEnableDelivery ํจ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!)
Source Code
๋ค์ต์คํธ๋ผ ํ์ด
import Foundation | |
func solution(_ N:Int, _ road:[[Int]], _ k:Int) -> Int { | |
//๋ง์์ด ํ๋๋ผ๋ฉด ์๊ธฐ ์์ ๋ฐ์ ์๋๋ฏ๋ก 1์ ๋ฐํ | |
if N == 1 { return 1 } | |
var allDistances = Array(repeating: Int.max, count: N+1) | |
//์์๊ฐ์ผ 1์ผ๋ก ๋ค์ต์คํธ๋ผ ์์ | |
dijkstra(allDistances: &allDistances ,road:road,start:1,n:N) | |
//๋ฐฐ๋ฌํ ์ ์๋ ๋ง์์ ๊ฐฏ์๋ฅผ ๋ฐํ | |
return findEnableDelivery(n: N, allDistances: allDistances, k: k) | |
} | |
//k๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ง์์ ๋ฐํํจ. | |
func findEnableDelivery(n:Int,allDistances:[Int],k:Int) -> Int { | |
return allDistances.filter{$0 <= k}.count | |
} | |
//๋ค์ต์คํธ๋ผ๋ก ์์ ์ ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ก ์ ๋ฐ์ดํธํด์ค. | |
func dijkstra(allDistances:inout [Int],road:[[Int]],start:Int,n:Int) { | |
//์๊ธฐ ์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ 0 | |
allDistances[start] = 0 | |
//์์ ์ธ๋ฑ์ค๋ฅผ ๋ด์ ํ๋ฅผ ๋ง๋ค์ด์ค. | |
var queue:[Int] = [start] | |
//ํ๊ฐ ๋ชจ๋ ์์ด์ง๋๊น์ง ๋ฐ๋ณต | |
while !queue.isEmpty { | |
//ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ ์ฅํ๋ฉด์ ์ญ์ ํด์ค. | |
let first = queue.removeFirst() | |
//road์์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฐ์ด ์๋ ๊ฒ๋ค๋ก ํํฐ๋ง ํด์ค. | |
let filter = road.filter{$0[0] == first || $0[1] == first} | |
//ํํฐ๋งํ ๊ฒ๋ค์ ์ํ | |
for f in filter { | |
//์ฒซ๋ฒ์งธ ๊ฐ์ด ์๋ ๊ฒ์ other๋ก ์ค์ | |
let other = f[0] == first ? f[1] : f[0] | |
//๋ง์ฝ Int ์ต๋๊ฐ์ด๋ผ๋ฉด continue | |
if allDistances[first] == Int.max {continue} | |
//์ฒซ๋ฒ์งธ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฒ์ด ์๋ ์๋ ๊ฐ๋ณด๋ค ์๋ค๋ฉด | |
if allDistances[first]+f[2] < allDistances[other] { | |
//์ฒซ๋ฒ์งธ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ๊ฒ์ผ๋ก ์ ๋ฐ์ดํธ | |
allDistances[other] = allDistances[first]+f[2] | |
//๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ํ์ ๋ฃ์ด์ค. | |
queue.append(other) | |
} | |
} | |
} | |
} |
ํ๋ก์ด๋ ์์ฌ ํ์ด
import Foundation | |
func solution(_ N:Int, _ road:[[Int]], _ k:Int) -> Int { | |
//๋ง์์ด ํ๋๋ผ๋ฉด ์๊ธฐ ์์ ๋ฐ์ ์๋๋ฏ๋ก 1์ ๋ฐํ | |
if N == 1 { return 1} | |
//๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅ | |
var allDistances = Array(repeating: Array(repeating: Int.max, count: N+1), count: N+1) | |
//๋ชจ๋ ์ฐ๊ฒฐ์ ์ธํ | |
setConnection(n:N,connections: road, allDistances: &allDistances) | |
//ํ๋ก์ด๋๋ก ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์ | |
floyd(n: N, allDistances: &allDistances) | |
//๋ฐฐ๋ฌ ๊ฐ๋ฅํ ๋ง์์ ๋ฐํ | |
return findEnableDelivery(n: N, allDistances: allDistances, k: k) | |
} | |
//k๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ง์์ ๋ฐํํจ. | |
func findEnableDelivery(n:Int,allDistances:[[Int]],k:Int) -> Int { | |
return allDistances[1].filter{$0 <= k}.count | |
} | |
//๋ชจ๋ ์ฐ๊ฒฐ์ ์ ์ฅ | |
func setConnection(n:Int,connections:[[Int]],allDistances:inout[[Int]]) { | |
//์๊ธฐ ์์ ์ 0์ผ๋ก ์ฒ๋ฆฌ | |
for i in 1...n { | |
allDistances[i][i] = 0 | |
} | |
//๋ง์ฝ ์ฐ๊ฒฐ๋ ๋๋ก๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด ๋ ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ์ด์ค. | |
for connection in connections { | |
allDistances[connection[0]][connection[1]] = min(allDistances[connection[0]][connection[1]],connection[2]) | |
allDistances[connection[1]][connection[0]] = min(allDistances[connection[1]][connection[0]],connection[2]) | |
} | |
} | |
//ํ๋ก์ด๋๋ก ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฃ์ด์ค. | |
func floyd(n:Int,allDistances:inout [[Int]]) { | |
for i in 1...n { | |
for j in 1...n { | |
for k in 1...n { | |
if allDistances[j][i] == Int.max || allDistances[i][k] == Int.max { continue } | |
if allDistances[j][i] + allDistances[i][k] < allDistances[j][k] { | |
allDistances[j][k] = allDistances[j][i] + allDistances[i][k] | |
} | |
} | |
} | |
} | |
} |
'๐ Problem Solution > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์๊ฐ ์ฝ๋ ์ฑ๋ฆฐ์ง 2 ๊ดํธ ํ์ ํ๊ธฐ (0) | 2021.05.31 |
---|---|
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ํ๋ ฌ ํ ๋๋ฆฌ ํ์ ํ๊ธฐ (0) | 2021.05.24 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค 2018 Summer/Winter Coding ๋ฐฉ๋ฌธ ๊ธธ์ด (0) | 2021.05.20 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์ฝ์์ ๊ฐ์์ ๋ง์ (0) | 2021.05.18 |
[Swift] ํ๋ก๊ทธ๋๋จธ์ค ์์ (0) | 2021.05.15 |
๋๊ธ