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

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

예제 입력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 = 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) { 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) }

from http://jefflim-81.tistory.com/40 by ccl(A) rewrite - 2021-11-30 10:28:06