티스토리 뷰

PS

[Swift] 백준_영역 구하기(2583)

희철 2023. 1. 15. 14:26

문제

 

https://www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

 

풀이

 

기본적인 BFS문제였다.

 

paper라는 변수를 만들고 주어진 입력을 받아 반복문을 통해 직사각형이 있는 곳을 1로 표시해주었다.(나머지는 0)

이후에 bfs를 돌리면되는데, paper[newX][newY]가 0인지만 확인해준뒤 맞다면 바로 큐에 넣어주었다.

 

while문 안에서 queue.removeFirst()를 할 때마다 이어져있는 넓이를 구하는 것이므로 area에 1을 더해주었고, while문을 탈출하게 되면 하나의 영역이 구해진 것이므로 result에 area를 추가해주었다.

import Foundation

let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let m = input[0]
let n = input[1]
let k = input[2]
let dx = [1,0,-1,0]
let dy = [0,1,0,-1]
var paper = Array(repeating: Array(repeating: 0, count: n), count: m)
var queue: [[Int]] = []
var count = 0
var result: [Int] = []
for _ in 0..<k {
    let input = readLine()!.split(separator: " ").map { Int(String($0))! }
    for i in input[1]..<input[3] {
        for j in input[0]..<input[2] {
            paper[i][j] = 1
        }
    }
}
for i in 0..<m {
    for j in 0..<n {
        if paper[i][j] == 0 {
            queue.append([i,j])
            paper[i][j] = 1
            count += 1
            var area = 0
            while !queue.isEmpty {
                area += 1
                let current = queue.removeFirst()
                for k in 0..<dx.count {
                    let newX = current[0] + dx[k]
                    let newY = current[1] + dy[k]
                    if newX < 0 || newY < 0 || newX >= m || newY >= n {
                        continue
                    }
                    if paper[newX][newY] == 0 {
                        paper[newX][newY] = 1
                        queue.append([newX,newY])
                    }
                }
            }
            result.append(area)
        }
    }
}
print(count)
print(result.sorted(by:<).map { String($0) }.joined(separator: " "))

 

 

_____________________________________________________________________________________________________

 

얼마전까지만해도 BFS가 아예 이해가 안갔는데 확실히 많이 풀어보니 조금씩 감이 잡히는 것 같다.

'PS' 카테고리의 다른 글

[Swift] 백준_스타트링크(5014)  (0) 2023.01.15
[Swift] 백준_단지번호붙이기(2667)  (0) 2023.01.15
[Swift] 백준_불(5427)  (0) 2023.01.14
[Swift] 백준_SHOW ME THE DUNGEON(25330)  (1) 2023.01.14
[Swift] 백준_물약 구매(24954)  (0) 2023.01.13
댓글
최근에 올라온 글
Total
Today
Yesterday