본문 바로가기

알고리즘

[백준][KOTLIN][1018]체스판 다시 칠하기

728x90

예제 입력1

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

예제 출력1

1

예제 입력2

10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

예제 출력2

12

풀이

  1. 기준이 되는 원본 데이터를 선언한다.(왼쪽 상단 첫번째가 검은색으로 시작하는 8X8 체스판과 흰색으로 시작하는 체스판)
val originB = arrayOf(
     "BWBWBWBW",
     "WBWBWBWB",
     "BWBWBWBW",
     "WBWBWBWB",
     "BWBWBWBW",
     "WBWBWBWB",
     "BWBWBWBW",
     "WBWBWBWB"
)

val originW = arrayOf(  
     "WBWBWBWB",
     "BWBWBWBW",  
     "WBWBWBWB",  
     "BWBWBWBW",  
     "WBWBWBWB",  
     "BWBWBWBW",  
     "WBWBWBWB",  
     "BWBWBWBW"
)
  1. 입력된 데이터를 2차원 char array 에 저장한다.
  2. char array 를 8X8 로 짜른 후 검은색 원본과 비교해서 다시 칠하는 수를 구하고 흰색 원본과 비교해서 다시 칠하는 수를 구해서 두 수중 최소값을 구한다.
  3. 입력된 데이터를 전체 검색하여 3번과정에서 나온 값들 중 최소값을 구한다.
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

var chess: Array<CharArray> = arrayOf()
val originB = arrayOf(
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB"
)

val originW = arrayOf(
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
)

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val st = StringTokenizer(br.readLine())
    val n = st.nextToken().toInt() // 세로
    val m = st.nextToken().toInt() // 가로
    chess = Array(n) {
        br.readLine().toCharArray()
    }

    var result = Int.MAX_VALUE

    for (i in 0..(n - 8)) {
        for (j in 0..(m - 8)) {
            val min = find(i, j)
            if (result > min) {
                result = min
            }
        }
    }

    println(result)
}

private fun find(x: Int, y: Int): Int {
    var countB = 0
    var countW = 0

    for (i in x until (x + 8)) {
        for (j in y until (y + 8)) {
            if (chess[i][j] != originB[i - x][j - y]) countB++
            else if (chess[i][j] != originW[i - x][j - y]) countW++
        }
    }

    return countB.coerceAtMost(countW)
}
728x90