[백준] 전쟁 - 전투 (1303)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는 병사가 한 명 있다. (B는 파랑, W는 흰색이다.)
» 출력
첫 번째 줄에 당신의 병사의 위력의 합과 적국의 병사의 위력의 합을 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
5 5 WBWWW WWWWW BBBBB BBBWW WWWWW |
130 65 |
3 4 WWW BBB WWW BBB |
18 18 |
문제 풀이1
import java.util.LinkedList
import kotlin.math.pow
var X: Int = 0
var Y: Int = 0
var chArr = arrayOf<CharArray>()
var visited = arrayOf<BooleanArray>()
var W: Int = 0
var B: Int = 0
val dx = intArrayOf(0,0,1,-1)
val dy = intArrayOf(1,-1,0,0)
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
readLine().split(" ").also {
X = it[0].toInt()
Y = it[1].toInt()
chArr = Array(Y) { charArrayOf() }
visited = Array(Y) { booleanArrayOf() }
}
for (y in 0 until Y) {
chArr[y] = readLine().toCharArray()
visited[y] = BooleanArray(X)
}
for (y in 0 until Y) {
for (x in 0 until X) {
if (visited[y][x]) continue
visited[y][x] = true
if (chArr[y][x] == 'W') {
W += bfs(y, x, 'W').pow(2).toInt()
} else {
B += bfs(y, x, 'B').pow(2).toInt()
}
}
}
println("$W $B")
}
fun bfs(y: Int, x: Int, tChar: Char): Double {
var ret = 1.0
val q = LinkedList<Pair<Int, Int>>()
q.add(Pair(y, x))
while (q.isNotEmpty()) {
val qPoll = q.poll()
for (i in 0 until 4) {
val ny = dy[i] + qPoll.first
val nx = dx[i] + qPoll.second
if (nx !in 0 until X || ny !in 0 until Y) continue
if (visited[ny][nx]) continue
if (chArr[ny][nx] == tChar) {
visited[ny][nx] = true
q.add(Pair(ny, nx))
ret += 1
}
}
}
return ret
}