[1018]백준 - 체스판 다시 칠하기 - JAVA
본문 바로가기

알고리즘/백준

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

728x90
반응형

안녕하세요 놀이방 사장입니다.

 

이번 포스팅은 백준 1018

체스판 다시 칠하기 포스팅입니다.

 

완전 탐색, 브루트포스 문제입니다.

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

이 문제는 N, M이 주어지면 이 체스판에서 8*8로 밑에 사진처럼 만들어주면 됩니다. WBWB 이런식으로 해도 무방합니다.

8 8 이 넘을경우 특정 부분을 떼서 최소의 수로 저렇게 만들어주면 됩니다.

package me.joyeonggyu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main{
    public static boolean[][] arr;
    public static int min = 64;
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        arr = new boolean[N][M];

        for (int i = 0; i < N; i++) {
            String str = br.readLine();

            for (int j = 0; j < M; j++) {
                if (str.charAt(j) == 'W') {
                    arr[i][j] = true;
                } else {
                    arr[i][j] = false;
                }
            }
        }
        int max_N = N - 7;
        int max_M = M - 7;

        for(int i=0; i<max_N; i++){
            for(int j=0; j<max_M; j++){
                find(i,j);
            }
        }
        System.out.println(min);
    }

    public static void find(int x, int y){
        int count = 0;
        boolean TF = arr[x][y];

        for(int i=x; i<x+8; i++){
            for(int j=y; j<y+8; j++){
                if(arr[i][j] != TF){
                    count++;
                }
                TF = !TF;
            }
            TF = !TF;
        }
        count = Math.min(count, 64-count);

        min = Math.min(min,count);

    }
}

find전 부분은 arr배열에 문자들을 담는 작업을 하는 것입니다.

 

max_N, max_N은 N,M체스판에서 뗄 수 있는 부분을 말하는 거에요

 

그리고 find에서 TF 변수를 통해 문자를 바꿔야하는 지 구분하는 거에요

그리고 count = Math.min(count, 64-count)

부분은 처음에 B로 시작하는 경우의 수랑 W로 시작하는 경우에 수중 뭐가 더 적은 지 찾는 부분입니다.

 

풀기가 어려우시다면 참조해서 푸시면 좋을 거 같습니다.!

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준1010번 다리 놓기 - JAVA  (1) 2023.12.29
백준[1032] 명령 프롬프트 - JAVA  (0) 2023.12.28
[백준]1340 - 연도 진행바 - JAVA  (0) 2023.12.05
[백준]1312 - 소수 - JAVA  (1) 2023.12.04
백준 1308 D-day 자바 풀이  (0) 2023.12.03