[백준] 전쟁 - 전투 (1303)(kotlin)

문제 설명

백준 1303번 문제 링크

입력 및 출력

» 입력

첫째 줄에는 전쟁터의 가로 크기 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
}