본문 바로가기
공부/알고리즘

[백준]1018_체스판 다시 칠하기_Java 풀이

by happyeuni 2023. 1. 24.

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

 

<풀이>

  • 4중 for문을 돌며...
  • 맨 위 왼쪽이 B로 시작하는지, W로 시작하는지 두가지 상황으로 나누어서 각각의 경우에 다른 값이 있는 개수를 각각 저장한다. -> 최소값을 비교
    • 왼쪽 위가 B로 시작하는 경우

                BWBWBWBW

                WBWBWBWB

                BWBWBWBW

                WBWBWBWB 와 같은 형태     


    • 왼쪽 위가 W로 시작하는 경우

                WBWBWBWB

                BWBWBWBW

                WBWBWBWB

                BWBWBWBW 와 같은 형태

 

  • 짝수행일 때와 홀수행일 때를 비교하여 탐색한다.
    • 짝수행인 경우 - 
      • 왼쪽 위가 B로 시작하는 경우는 : BWBW가 될테니 짝수열: B, 홀수열:W가 있어야한다.
      • 왼쪽 위가 W로 시작하는 경우는 : WBWB가 될테니 짝수열:W, 홀수열:B가 있어야한다.
    • 홀수행인 경우 - 
      • 왼쪽 위가 B로 시작하는 경우는 홀수행은 WBWB가 될테니 짝수열:W, 홀수열:B가 있어야한다.
      • 왼쪽 위가 W로 시작하는 경우는 : BWBW가 될테니 짝수열: B, 홀수열:W가 있어야한다.

 

package BruteForce;

import java.io.*;
import java.util.StringTokenizer;

public class Main_1018 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        char [][] board = new char[M][N];
        int min = Integer.MAX_VALUE;

        for (int i = 0; i < M; i++) {
            String s = br.readLine();
            for (int j = 0; j < N; j++) {
                board[i][j] = s.charAt(j);
            }
        }
        // 8개 어떻게 자를 것인지
        // 어떻게 교차해서 칠할 것인지 - 개수 세기기
        // 홀, 짝
        for (int i = 0; i < M-7; i++) {
            for (int j = 0; j < N-7; j++) {
                int evenB = 0; // 왼쪽 위 B 로 시작
                int evenW = 0; // 왼쪽 위 W 로 시작
                for (int k = i; k < i+8; k++) {
                    for (int l = j; l < j+8; l++) {
//                        if(k<M && l<N){
                            if(k % 2 == 0){ //짝수 행
                                // 왼쪽 위 B 로 시작 -> 짝수행에서 짝수열:B,홀수열:W
                                if((l%2==0 && board[k][l] != 'B') || (l%2!=0 && board[k][l] != 'W')){
                                    evenB++;
                                }
                                // 왼쪽 위 W 로 시작 -> 짝수행에서 짝수열:W,홀수열:B
                                if((l%2==0 && board[k][l] != 'W') || (l%2!=0 && board[k][l] != 'B')){
                                    evenW++;
                                }
                            }
                            if(k % 2 != 0){ //홀수 행
                                // 왼쪽 위 B 로 시작 -> 홀수 행에서 짝수열:W,홀수열:B
                                if((l%2==0 && board[k][l] != 'W') || (l%2!=0 && board[k][l] != 'B')){
                                    evenB++;
                                }
                                // 왼쪽 위 W 로 시작 -> 홀수 행에서 짝수열:B,홀수열:W
                                if((l%2==0 && board[k][l] != 'B') || (l%2!=0 && board[k][l] != 'W')){
                                    evenW++;
                                }
                            }
//                        }
                    }
                }
                evenB = evenB < evenW ? evenB : evenW;
                min = min < evenB ? min : evenB;
            }

        }

        System.out.println(min);

    }
}

 

 

댓글