경험의 기록

문제 : www.acmicpc.net/problem/1303

 

1303번: 전쟁 - 전투

첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는

www.acmicpc.net

 

 

var arr = arrayOf(arrayOf<Char>())
var white = 0
var blue = 0
var whitesum = 0
var bluesum = 0

// 상하좌우
val dx = listOf(-1,1,0,0)
val dy = listOf(0,0,-1,1)

fun main() = with(System.`in`.bufferedReader()){

    // 가로, 세로크기
    var (n,m) = readLine().split(" ").map { it.toInt() }

    // 병사 배열 입력
    arr = Array(m){ Array<Char>(n){' '} }
    for(i in 0 until m){
        val tmp = readLine().toString()
        for(j in 0 until n){
            arr[i][j] = tmp[j]
        }
    }

    // 방문 여부
    val visit = Array(m){Array(n){0} }

    // dfs
    fun dfs(x : Int, y : Int){
        visit[x][y] = 1 // 방문표시

        if(arr[x][y] == 'W') white++
        else if(arr[x][y] == 'B') blue++

        for(i in 0 until 4){
            val nx = x+dx[i]
            val ny = y+dy[i]

            // 상하좌우 탐색
            if(nx >= 0 && ny >= 0 && nx < m && ny < n){
                if(arr[nx][ny] == arr[x][y] && visit[nx][ny] == 0){
                    dfs(nx,ny)
                }
            }
        }
    }

    // 방문하지 않은 곳만 방문
    for(i in 0 until m){
        for(j in 0 until n){
            if(visit[i][j] == 0){
                dfs(i,j)
                // dfs 가 끝날때마다 병사 계산
                whitesum += white*white
                bluesum += blue*blue
                white = 0
                blue = 0
            }
        }
    }

    println(whitesum)
    println(bluesum)
}

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading