반응형
입력 & 출력
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력해라.
그림의 넓이란 그림에 포함된 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)
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[백준] BFS - 7576번 토마토 (0) | 2021.10.01 |
---|---|
[백준] BFS - 2178번 미로탐색 (0) | 2021.09.28 |
[백준] 그리디 - 1931번 회의실 배정 (0) | 2021.04.29 |
[백준] 그리디 - 11047번 동전 0 (0) | 2021.04.29 |
[백준] 브루트포스 - 14888번 연산자 끼워넣기 (0) | 2021.04.29 |