쥐수의 공부노트

백준 1926번 그림 본문

바킹독 알고리즘/BFS

백준 1926번 그림

쥐수 2023. 9. 11. 13:55
728x90

 

정답 :

import Foundation

// 1926번

let num = readLine()!.split(separator: " ").map{Int($0)!}
let row = num[0]
let col = num[1]
var array = [[Int]]()
var queue = [(Int,Int)]()
var visited = Array(repeating: Array(repeating: false, count: col), count: row)
var count = 0
var big = 0

for _ in 0..<row {
    let input = readLine()!.split(separator: " ").map{Int($0)!}
    array.append(input)
}

func bfs(array : [[Int]],r : Int,c :Int) {
    var cur_max = 1
    let rowLen = array.count
    let colLen = array[0].count
    let dr = [0, 1, 0, -1]
    let dc = [1, 0, -1, 0]
    
    visited[r][c] = true
    queue.append((r,c))
    while !queue.isEmpty {
        let (cur_r,cur_c) = queue.removeFirst()
        for i in 0..<4 {
            let next_r = cur_r + dr[i]
            let next_c = cur_c + dc[i]
            if 0 <= next_r && next_r < rowLen && 0<=next_c && next_c < colLen {
                if !visited[next_r][next_c] && array[next_r][next_c] == 1 {
                    queue.append((next_r,next_c))
                    visited[next_r][next_c] = true
                    cur_max += 1
                }
            }
        }
    }
    big = max(big, cur_max)
}

for i in 0..<row{
    for j in 0..<col {
        if !visited[i][j] && array[i][j] == 1 {
            bfs(array: array,r: i,c: j)
            count += 1
        }
    }
}
print(count,big)

여담으로 시작!

 

현재 저희 학교에서 주최하는 코딩테스트 특강으로 인해, 지금까지 단계별로 풀어보기 순으로 진행을 하였지만, 배운 것을 바로 써보면서 익히는게 중요하다 생각하여 순서를 바꾸도록 하겠습니다. 배운 것만 먼저 진행하고 그 다음에 다시 돌아가서 순서대로 진행하겠습니다.

 

해당 문제는 BFS를 이용해서 연결된 그림을 찾아가며 그 그림의 크기를 비교하고, 그림의 개수가 몇개인지를 판별하는 문제입니다.

BFS의 가장 큰 특징은 queue를 사용하는 것인데, 이는 우리가 가야할 곳을 예약하고 차례대로 이동하는 것이 특징입니다.

 

그림의 전체 개수는 이중 for문에서 bfs 함수가 불려가는 개수만큼 나오게 되고, 그림의 가장 큰 크기는 bfs가 모두 끝나는 순간에 비교하면 끝!

 

728x90

'바킹독 알고리즘 > BFS' 카테고리의 다른 글

백준 2178번 미로 탐색  (0) 2023.09.11