백준 2667_ swift_bfs

hankyulee·2021년 9월 29일
0

Swift coding test 준비

목록 보기
5/57

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가 나온거 보면 어긋나진 않은것같다.

  • string을 readline으로 받았는데, 그 중 하나하나 보려면 char이다. enumrated로 char 하나하나 보면서 인티저로 바꿔야하는데 스트링이어야 하나보다.
    -sorted는 인라인 아니다. sort는 인라인.
  • 다음과 같이 해도된다.
var graph = Array(repeatElement(Array<Int>(), count: N))// 미리 빈행을 만들어 놓는것.

0개의 댓글