[백준] 양 (3184)(kotlin)
문제 설명
입력 및 출력
» 입력
- 첫 줄에는 두 정수 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
}
}