알고리즘
[백준][KOTLIN][1018]체스판 다시 칠하기
금님은님아부지
2021. 11. 30. 10:25
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
풀이
- 기준이 되는 원본 데이터를 선언한다.(왼쪽 상단 첫번째가 검은색으로 시작하는 8X8 체스판과 흰색으로 시작하는 체스판)
val originB = arrayOf(
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"
)
val originW = arrayOf(
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"
)
- 입력된 데이터를 2차원 char array 에 저장한다.
- char array 를 8X8 로 짜른 후 검은색 원본과 비교해서 다시 칠하는 수를 구하고 흰색 원본과 비교해서 다시 칠하는 수를 구해서 두 수중 최소값을 구한다.
- 입력된 데이터를 전체 검색하여 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