[BFS] 백준: 영역 구하기(Swift)

2022. 11. 8. 20:20·코테

난이도: 실버 1

사용 언어: Swift

카테고리: BFS

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

2583번: 영역 구하기

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

www.acmicpc.net

Code

struct Queue<T> {
  var memory = [T]()
  var index = 0
  
  var isEmpty: Bool {
    memory.count < index + 1
  }
  
  mutating func inQueue(element: T) {
    memory.append(element)
  }
  
  mutating func deQueue() -> T {
    let v = memory[index]
    index += 1
    return v
  }
}

let mnk = readLine()!.split(separator: " ").map { Int($0)! }
let m = mnk[0]
let n = mnk[1]
let k = mnk[2]

var map = Array(repeating: Array(repeating: false, count: n), count: m)

for _ in 0..<k {
  let xy = readLine()!.split(separator: " ").map { Int($0)! }
  for y in xy[1]..<xy[3] {
    for x in xy[0]..<xy[2] {
      map[y][x] = true
    }
  }
}

var q = Queue<(y: Int, x: Int)>()
let direction: [(y: Int, x: Int)] = [
  (0,-1),
  (0,1),
  (-1,0),
  (1,0)
]
var count = 0
func bfs(start: (y: Int, x: Int)) -> Int {
  map[start.y][start.x] = true
  count += 1
  q.inQueue(element: start)
  var r = 1
  while !q.isEmpty {
    let cP = q.deQueue()
    for i in 0..<direction.count {
      let nP: (y: Int, x: Int) = (cP.y + direction[i].y, cP.x + direction[i].x)
      if (0..<m).contains(nP.y)
          && (0..<n).contains(nP.x)
          && !map[nP.y][nP.x] {
        map[nP.y][nP.x] = true
        r += 1
        q.inQueue(element: nP)
      }
    }
  }
  return r
}

var arr = [Int]()

for y in 0..<m {
  for x in 0..<n {
    if !map[y][x] {
      arr.append(bfs(start: (y, x)))
    }
  }
}

print(count)
arr.sorted(by: <).forEach {
  print($0, terminator: " ")
}

'코테' 카테고리의 다른 글

[DFS + DP] 백준 1520번: 내리막길(Swift)  (0) 2022.11.11
[DFS] 백준 2644번: 촌수계산(Swift)  (0) 2022.11.09
[DFS] 백준 11725번: 트리의 부모 찾기(Swift)  (0) 2022.11.07
[DFS] 백준 1987번: 알파벳(Swift)  (0) 2022.11.02
[BFS] 백준: 안전 영역(Swift)  (0) 2022.11.01
'코테' 카테고리의 다른 글
  • [DFS + DP] 백준 1520번: 내리막길(Swift)
  • [DFS] 백준 2644번: 촌수계산(Swift)
  • [DFS] 백준 11725번: 트리의 부모 찾기(Swift)
  • [DFS] 백준 1987번: 알파벳(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    다이나믹 프로그래밍
    그리디
    알고리즘
    Property wrapper
    photos
    ios
    비동기
    실버
    photoUI
    재귀
    구현
    네부캠
    탐색
    브루트포스 알고리즘
    Race Condition
    백준
    동시성
    챌린지
    Swift
    PhotoKit
    GCD
    dfs
    BFS
    코테
    노드
    Combine
    이분탐색
    회고
    완전탐색
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[BFS] 백준: 영역 구하기(Swift)
상단으로

티스토리툴바