ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1926 그림
    Algorithm/BOJ 2021. 2. 5. 15:26
    728x90

    출처: https://www.acmicpc.net/problem/1926

    분류: BFS


    접근방식

    BFS 방식으로 풀어봤습니다.

    bfs를 시작하면서 그림의 개수를 세고, bfs 안에서 queue에서 꺼낼 때마다 카운트 해서 그림의 너비를 계산했습니다.

    queue는 DoubleStackQueue를 사용했습니다.

     

    해결방법

    
    struct DoubleStackQueue<Element> {
        private var inbox: [Element] = []
        private var outbox: [Element] = []
    
        var isEmpty: Bool{
            return inbox.isEmpty && outbox.isEmpty
        }
    
        var count: Int{
            return inbox.count + outbox.count
        }
    
        var front: Element? {
            return outbox.last ?? inbox.first
        }
    
        init() { }
    
        init(_ array: [Element]) {
            self.init()
            self.inbox = array
        }
    
        mutating func enqueue(_ n: Element) {
            inbox.append(n)
        }
    
        mutating func dequeue() -> Element? {
            if outbox.isEmpty {
                outbox = inbox.reversed()
                inbox.removeAll()
            }
            guard !outbox.isEmpty else { return nil }
            return outbox.removeLast()
        }
    }
    
    extension DoubleStackQueue: ExpressibleByArrayLiteral {
        init(arrayLiteral elements: Element...) {
            self.init()
            inbox = elements
        }
    }
    
    // MARK: - Solution
    
    struct Point {
        var row: Int
        var col: Int
        var value = 1
        
        var moves: [Point] {
            return [
                Point(row-1, col),
                Point(row+1, col),
                Point(row, col-1),
                Point(row, col+1)
            ]
        }
        
        func isInRange(r rows: Range<Int>, c cols: Range<Int>) -> Bool {
            return rows.contains(row) && cols.contains(col)
        }
        
        init(_ row: Int, _ col: Int) {
            self.row = row
            self.col = col
        }
    }
    
    var data = readLine()!.split(separator: " ").map { Int($0)! }
    let r = data[0]
    let c = data[1]
    var numberOfPicture = 0
    var maxWidth = 0
    
    var board = [[Int]]()
    for _ in 0..<r {
        board.append(readLine()!.split(separator: " ").map({ Int($0)! }))
    }
    
    var visited = [[Bool]](repeating: [Bool](repeating: false, count: c), count: r)
    
    func bfs(_ p: Point) {
        var queue = DoubleStackQueue<Point>()
        queue.enqueue(p)
        visited[p.row][p.col] = true
        var currentWidth = 1
        
        while !queue.isEmpty {
            let curr = queue.dequeue()!
            if currentWidth > maxWidth {
                maxWidth = currentWidth
            }
            for next in curr.moves where next.isInRange(r: 0..<r, c: 0..<c)  {
                guard board[next.row][next.col] == 1, !visited[next.row][next.col] else { continue }
                visited[next.row][next.col] = true
                currentWidth += 1
                var next = next
                next.value = currentWidth
                queue.enqueue(next)
            }
        }
    }
    
    for r in 0..<r {
        for c in 0..<c {
            guard !visited[r][c], board[r][c] == 1 else { continue }
            bfs(Point(r, c))
            numberOfPicture += 1
        }
    }
    
    print(numberOfPicture)
    print(maxWidth)

    회고

     

    BFS를 풀 때 만큼은 기계가 되자 .

    'Algorithm > BOJ' 카테고리의 다른 글

    백준 1074 Z  (0) 2021.02.18
    백준 1992 쿼드트리  (0) 2021.02.18
    백준 1759 암호만들기  (0) 2021.02.02
    백준 15649 N과 M(1)  (0) 2021.01.28
    백준 2252 줄 세우기  (0) 2021.01.27

    댓글

Designed by Tistory.