[백준] 양 (3184)(kotlin)

문제 설명

백준 3184번 문제 링크

입력 및 출력

» 입력

  • 첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

» 출력

하나의 줄에 아침까지 살아있는 양과 늑대의 수를 의미하는 두 정수를 출력한다.

예제 입출력(테스트케이스)

입력 출력
6 6
…#..
.##v#.
#v.#.#
#.o#.#
.###.#
…###
0 2
8 8
.######.
#..o…#
#.####.#
#.#v.#.#
#.#.o#o#
#o.##..#
#.v..v.#
.######.
3 1
9 12
.###.#####..
#.oo#…#v#.
#..o#.#.#.#.
#..##o#…#.
#.#v#o###.#.
#..#v#….#.
#…v#v####.
.####.#vv.o#
…….####.
3 5

문제 풀이1

import java.util.LinkedList

var R = 0
var C = 0
var map = arrayOf<CharArray>()
var check = arrayOf<BooleanArray>()
var sheeps = 0
var wolves = 0

val dr = intArrayOf(0, 0, 1, -1)
val dc = intArrayOf(1, -1, 0, 0)

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    readLine().split(" ").also {
        R = it[1].toInt()
        C = it[0].toInt()
    }

    map = Array(C) { readLine().toCharArray() }
    check = Array(C) { BooleanArray(R) }

    for (c in 0 until C) {
        for (r in 0 until R) {
            if (map[c][r] != '#' && !check[c][r]) {
                check[c][r] = true
                bfs(r, c)
            }
        }
    }

    println("$sheeps $wolves")
}

fun bfs(r: Int, c: Int) {
    var she = 0
    var wol = 0

    when(map[c][r]) {
        'o' -> she += 1
        'v' -> wol += 1
        else -> Unit
    }

    val q = LinkedList<Pair<Int, Int>>()
    q.add(Pair(r, c))

    while (q.isNotEmpty()) {
        val now = q.pop()

        for (i in 0 until 4) {
            val nr = now.first + dr[i]
            val nc = now.second + dc[i]

            if (nr !in 0 until R || nc !in 0 until C) continue
            if (map[nc][nr] == '#') continue
            if (check[nc][nr]) continue

            check[nc][nr] = true
            q.push(Pair(nr, nc))

            when(map[nc][nr]) {
                'o' -> she += 1
                'v' -> wol += 1
                else -> Unit
            }
        }
    }

    if (she > wol) {
        sheeps += she
    } else {
        wolves += wol
    }
}