bfs가 미숙하여 오랜시간이 걸렸다.. 리커시브는 어렵다..
let n = Int(readLine()!)!
var graph:[[Int]] = Array(repeating: Array(repeating: 0, count: n), count: n)
for i in 0..<n {
let input = readLine()
input?.enumerated().map { (index,str) in
graph[i][index] = Int(String(str))!
}
}
func dfs(x:Int,y:Int)->Int{
var result = 0
if x >= 0 && x < n && y >= 0 && y < n {
if graph[x][y] == 1 {
graph[x][y] = 0
result += 1
} else { return 0 }
}
if x+1 >= 0 && x+1 < n && y >= 0 && y < n {
if graph[x+1][y] == 1 {
result += dfs(x: x+1, y: y)
}
}
if x-1 >= 0 && x-1 < n && y >= 0 && y < n {
if graph[x-1][y] == 1 {
result += dfs(x: x-1, y: y)
}
}
if x >= 0 && x < n && y-1 >= 0 && y-1 < n {
if graph[x][y-1] == 1 {
result += dfs(x: x, y: y-1)
}
}
if x >= 0 && x < n && y+1 >= 0 && y+1 < n {
if graph[x][y+1] == 1 {
result += dfs(x: x, y: y+1)
}
}
return result
}
var result : [Int] = [Int]()
func whatIsResult(){
for i in 0..<n {
for j in 0..<n{
result.append(dfs(x: i, y: j))
}
}
result = result.filter { n in
if n == 0 {return false}
else {return true}
}.sorted(by: <)
print(result.count)
for i in 0..<result.count {
print(result[i])
}
}
whatIsResult()
그래프를 하나하나 뒤져보러(?) 가는데, 갈 수 있는 좌표인지 확인 후 자리가 1이면 결과에 1을 더하는 식이다. 이웃하는 셀에 갈 필요가 있는지 확인 한 후 간다.
결과가 1등과 동일한 8ms가 나온거 보면 어긋나진 않은것같다.
var graph = Array(repeatElement(Array<Int>(), count: N))// 미리 빈행을 만들어 놓는것.