본문 바로가기
Algorithm and PS/백준(Kotlin)

백준 - 3187 양치기 꿍 (코틀린)

by ESHC 2022. 4. 7.

[문제]

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

 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net

[풀이]

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
}

 

댓글