๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 2018 Summer/Winter Coding ๋ฐฐ๋‹ฌ

by Fomagran ๐Ÿ’ป 2021. 5. 21.
728x90
๋ฐ˜์‘ํ˜•

 

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)
}
}
}
}
view raw ๋ฐฐ๋‹ฌ.swift hosted with โค by GitHub

 

ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ํ’€์ด

 

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]
}
}
}
}
}
view raw ๋ฐฐ๋‹ฌ.swift hosted with โค by GitHub

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€