본문 바로가기

개발/알고리즘

[백준] BFS - 1926번 그림

반응형
 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로

www.acmicpc.net

입력 & 출력

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력해라. 
그림의 넓이란 그림에 포함된 1의 개수이다.
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라.
단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

풀이

BFS 문제로, 방문 기록과 현재 좌표의 상하좌우를 탐색하며 조건에 맞는 도화지를 찾아본다.

 

Swift 전체 코드

    let num = readLine()!.split(separator: " ")
    let height = Int(num.first!)!
    let width = Int(num.last!)!
    
    var array : [[Int]] = []
    var vis : [[Bool]] = .init(repeating: .init(repeating: false, count: width), count: height)
    var queue : [[Int]] = []
  
    // 상하좌우를 확인하기 위한 좌표 변수
    let dx = [0, 0, 1, -1]
    let dy = [1, -1, 0, 0]

    // 탐색 위치 변수
    var (max, total, count) = (0, 0, 0)
    
    // count 가 추가되는 조건은 상하좌우가 0이거나 이미 방문한 1일 때
    // total 이 추가되는 조건은 방문한 적없는 1일때
    
    for _ in 0..<height {
        let value = readLine()!.split(separator: " ").map{ Int("\($0)")! }
        var intArray : [Int] = []
        
        for j in value {
            intArray.append(j)
        }
        array.append(intArray)
    }
    
    for i in 0..<height {
        for j in 0..<width where vis[i][j] == false && array[i][j] == 1 {
            queue.append([i,j])
            vis[i][j] = true
            total = 1
            
            while !queue.isEmpty {
                let pop = queue.popLast()!
                
                for k in 0..<4 {
                    let x = dx[k] + pop.first!
                    let y = dy[k] + pop.last!
                    
                    if x < 0 || x >= height || y < 0 || y >= width {
                        continue
                    }
                    if array[x][y] == 0 || vis[x][y] == true {
                        continue
                    }
                    queue.append([x,y])
                    total += 1
                    vis[x][y] = true
                }
                max = max > total ? max : total
            }
            count += 1
        }
    }
    
    print(count)
    print(max)
반응형