[체스판 다시 칠하기 - 1018]
* 로직
- (0,0)부터 8*8 보드를 만들 수 있는 기준점으로 한 칸씩 이동한다
- 이동하면서 왼쪽 상단의 시작인 "W", "B"인 경우를 고려한다
- "W"인 경우
- 행이 짝수이면서
- 열도 짝수라면 -> 해당 좌표 값이 "W"가 아니면 cnt++
- 열이 홀수라면 -> 해당 좌표 값이 "B"가 아니면 cnt++
- 행이 홀수이면서
- 열이 짝수라면 -> 해당 좌표 값이 "B"가 아니면 cnt++
- 열이 홀수라면 -> 해당 좌표 값이 "W"가 아니면 cnt++
- 행이 짝수이면서
- "B"인 경우도 같은 방식으로 진행한다
- 최소 개수를 갱신하고 출력한다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Problem_1018 {
static int N,M;
static int Size = 8;
static String[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String input = br.readLine();
st = new StringTokenizer(input, " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new String[N][M];
for(int i=0; i<N; ++i){
input = br.readLine();
for(int j=0; j<M; ++j){
map[i][j] = input.substring(j, j+1);
}
}
//기준점 이동
int answer = Integer.MAX_VALUE;
for(int i=0; i<N-Size+1; ++i){
for(int j=0; j<M-Size+1; ++j){
//해당 기준점이 W로 시작하는 경우 고려
answer = Math.min(answer, doProcess(i, j, "W"));
//해당 기준점이 B로 시작하는 경우 고려
answer = Math.min(answer, doProcess(i, j, "B"));
}
}
System.out.println(answer);
}
private static int doProcess(int row, int col, String type) {
int cnt = 0;
switch (type){
case "W":
for(int a=0; a<8; ++a) {
for (int b=0; b<8; ++b) {
//행이 짝수 위치에서
if(a % 2 == 0){
//열이 짝수인 경우, W가 존재하지 않다면 카운트
if(b % 2 == 0){
if(!map[row+a][col+b].equals("W")) cnt++;
}
//열이 홀수인 경우, B가 존재하지 않다면 카운트
else {
if(!map[row+a][col+b].equals("B")) cnt++;
}
}
//행이 홀수 위치에서
else {
//열이 짝수인 경우, B가 존재하지 않다면 카운트
if(b % 2 == 0){
if(!map[row+a][col+b].equals("B")) cnt++;
}
//열이 홀수인 경우, W가 존재하지 않다면 카운트
else {
if(!map[row+a][col+b].equals("W")) cnt++;
}
}
}
}
break;
case "B":
for(int a=0; a<8; ++a) {
for (int b=0; b<8; ++b) {
//행이 짝수 위치에서
if(a % 2 == 0){
//열이 짝수인 경우, B가 존재하지 않다면 카운트
if(b % 2 == 0){
if(!map[row+a][col+b].equals("B")) cnt++;
}
//열이 홀수인 경우, W가 존재하지 않다면 카운트
else {
if(!map[row+a][col+b].equals("W")) cnt++;
}
}
//행이 홀수 위치에서
else {
//열이 짝수인 경우, W가 존재하지 않다면 카운트
if(b % 2 == 0){
if(!map[row+a][col+b].equals("W")) cnt++;
}
//열이 홀수인 경우, B가 존재하지 않다면 카운트
else {
if(!map[row+a][col+b].equals("B")) cnt++;
}
}
}
}
break;
}
return cnt;
}
}
'Algorithm > Problem_백준' 카테고리의 다른 글
동적 계획법1(RGB 거리, 정수 삼각형) (0) | 2020.03.10 |
---|---|
백트래킹(N과 M - 1~4) (0) | 2020.03.03 |
위상정렬(줄세우기, 최종순위) (0) | 2020.02.04 |
최소 신장 트리 MST(최소 스패닝 트리, 별자리 만들기) (0) | 2020.01.23 |
Union & Find (집합의 표현, 여행가자) (0) | 2020.01.23 |