[문제]
https://www.acmicpc.net/problem/3187
[풀이]
bfs 문제. 좌표를 돌면서 울타리 안의 해당 좌표가 늑대와 양의 수를 구하고 양이 늑대보다 많은 경우에는 전체 양의 수를 늘려주고 그 이외의 경우(늑대가 더 많거나 수가 같거나)에는 전체 늑대의 수를 늘려준다.
[코드]
import java.util.*
private var n = 0
private var m = 0
private lateinit var arr : Array<CharArray>
private lateinit var visited : Array<BooleanArray>
private val dx = listOf(1,-1,0,0)
private val dy = listOf(0,0,1,-1)
private var sheep = 0
private var wolf = 0
fun main() {
val br = System.`in`.bufferedReader()
br.readLine().split(" ").map { it.toInt() }.apply {
n = this[0]
m = this[1]
}
arr = Array(n){ CharArray(m) }
visited = Array(n){ BooleanArray(m) }
repeat(n){
arr[it] = br.readLine().toCharArray()
}
for(i in 0 until n){
for(j in 0 until m){
if(arr[i][j] == 'v' || arr[i][j] == 'k') {
if (visited[i][j]) continue
bfs(i,j)
}
}
}
println("${sheep} ${wolf}")
}
private fun bfs(px : Int, py : Int){
val queue : Queue<Pair<Int,Int>> = ArrayDeque()
var mSheep = 0
var mWolf = 0
queue.add(Pair(px,py))
visited[px][py] = true
if(arr[px][py] == 'k') mSheep += 1
else mWolf += 1
while (queue.isNotEmpty()){
val (x,y) = queue.poll()
for(i in 0 .. 3){
val nx = x + dx[i]
val ny = y + dy[i]
if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue
if(arr[nx][ny] == '#') continue
if(visited[nx][ny]) continue
if(arr[nx][ny] == 'k') mSheep += 1
else if(arr[nx][ny] == 'v') mWolf += 1
queue.add(Pair(nx,ny))
visited[nx][ny] = true
}
}
if(mSheep > mWolf) sheep += mSheep
else wolf += mWolf
}
'Algorithm and PS > 백준(Kotlin)' 카테고리의 다른 글
백준 - 21610 마법사 상어와 비바라기 (코틀린) (0) | 2022.04.14 |
---|---|
백준 - 2933 미네랄 (코틀린) (0) | 2022.04.07 |
백준 - 11123 양 한마리... 양 두마리... (코틀린) (0) | 2022.04.05 |
백준 - 2961 도영이가 만든 맛있는 음식 (코틀린) (0) | 2022.04.05 |
백준 - 14916 거스름돈 (코틀린) (0) | 2022.04.04 |
댓글