728x90
๋ฐ์ํ
Problem
Solution
1. ์ ์ ๋ง์ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ connect ์ด์ค๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ ์ฅํ๋ค.
var connect = Array(repeating: Array(repeating: false, count: n+1), count:n+1)
wires.forEach {
connect[$0[0]][$0[1]] = true
connect[$0[1]][$0[0]] = true
}
2. ์ฐ๊ฒฐ๋ ์ ์ ์ ํ๋์ฉ ์๋ผ๋ณด๋ฉฐ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๊ฐฏ์๋ฅผ ์ธ์ฃผ๊ณ ์ต์๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค.
์ฐ์ ์ต์๊ฐ์ ์ ์ฅํ๋ minCount ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๋ง์ฝ 1๊ณผ 3์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ์ด ์ฐ๊ฒฐ์ ๋๊ณ 1๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ๊ฐฏ์(leftCount)์
3๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ ๊ฐฏ์(rightCount)๋ฅผ ๋บ ๊ฐ๊ณผ ์ต์๊ฐ์ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ ์ต์๊ฐ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
var minCount:Int = Int.max
wires.forEach {
var leftCount:Int = 0
var rightCount:Int = 0
countConnectingWire(parent: nil, start: $0[0],stop: $0[1], count: &leftCount,connect: connect)
countConnectingWire(parent: nil, start: $0[1],stop: $0[0] ,count: &rightCount,connect: connect)
minCount = min(minCount,abs(leftCount-rightCount))
}
3. dfs๋ก ํน์ ์ ์ ์ด ๋ค๋ฅธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๊ฐฏ์๋ฅผ ์ธ์ค๋ค.
์์์ ์ ์ฅํ connect ์ ๋ณด๋ฅผ ํตํด์ ์ฐ๊ฒฐ๋ ์ ์ ์ ํํฐ๋ง ํด์ค๋๋ค.
๋ฌดํ๋ฃจํ๋ฅผ ๋ง๊ธฐ ์ํด ๋ฐ๋ก ๊ทธ ์ ๋ ธ๋(parent)์ stop(์ผ์ชฝ์ ์ ์ ์ผ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ,์ค๋ฅธ์ชฝ์ ์ ์ ์ผ ๊ฒฝ์ฐ ์ผ์ชฝ)์ผ ๊ฒฝ์ฐ๋ฅผ
์ ์ธํ ๊ฐฏ์๋ฅผ count์ ๋ํด์ค๋๋ค.
func countConnectingWire(parent:Int?,start:Int,stop:Int,count:inout Int,connect:[[Bool]]) {
let filter = connect[start].enumerated().filter{$0.element && $0.offset != parent && $0.offset != stop}.map{$0.offset}
count += filter.count
filter.forEach {
countConnectingWire(parent:start,start: $0, stop: stop, count: &count,connect: connect)
}
}
4. ์ต์๊ฐ์ ๋ฐํํฉ๋๋ค.
return minCount
Source Code
728x90
๋ฐ์ํ
๋๊ธ