ebson

boj.kr/1080 체스판 다시 칠하기 (silver4) 자바 풀이 본문

ALGORITHM STUDY WITH PYTHON/Bruteforce

boj.kr/1080 체스판 다시 칠하기 (silver4) 자바 풀이

ebson 2024. 6. 1. 07:50

1. N 행 M 열의 체스판을 순회하면서 아래를 수행

1.1. 0행 0열을 B로 시작하는 체스판으로 바꾸는 경우에 바꿔야 하는 칸의 개수를 카운트

1.2. 0행 0열을 W로 시작하는 체스판으로 바꾸는 경우에 바꿔야 하는 칸의 개수를 카운트

2. N 행 M 열의 체스판에서 8*8 크기의 체스판을 구하는 모든 경우에 아래를 수행

2.1. 0행 0열을 B로 시작하는 경우, cntList 으로 8*8 크기의 체스판에서 바꿔야 하는 칸의 개수를 추가 

2.1. 0행 0열을 W로 시작하는 경우, cntList 으로 8*8 크기의 체스판에서 바꿔야 하는 칸의 개수를 추가 

3. 모든 바꿔야하는 칸의 개수의 경우의 수 중에서 최소값을 출력 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args)  {

        try {
            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());

            String[] board = new String[N];

            for (int i = 0; i<N; i++){
                board[i] = br.readLine();
            }

            int[][] cntListB = new int[N][M];
            int[][] cntListW = new int[N][M];

            for (int r=0; r<N; r++){
                for (int c=0; c<M; c++) {
                    if (r % 2 == 0){
                        if (c % 2 == 0){
                            if(board[r].charAt(c) == 'W') {
                                cntListB[r][c] = 1;
                            } else {
                                cntListW[r][c] = 1;
                            }
                        } else {
                            if(board[r].charAt(c) == 'B') {
                                cntListB[r][c] = 1;
                            } else {
                                cntListW[r][c] = 1;
                            }
                        }
                    } else {
                        if (c % 2 == 0){
                            if(board[r].charAt(c) == 'B') {
                                cntListB[r][c] = 1;
                            } else {
                                cntListW[r][c] = 1;
                            }
                        } else {
                            if(board[r].charAt(c) == 'W') {
                                cntListB[r][c] = 1;
                            } else {
                                cntListW[r][c] = 1;
                            }
                        }
                    }
                }
            }

            int cntB = 0;
            int cntW = 0;

            int ans = Integer.MAX_VALUE;
            for (int i=0; i<N-7; i++){
                for (int j=0; j<M-7; j++){
                    for (int r=0; r<8; r++){
                        for (int c=0; c<8; c++){
                            cntB += cntListB[i+r][j+c];
                            cntW += cntListW[i+r][j+c];
                        }
                    }
                    ans = Math.min(ans, cntB);
                    ans = Math.min(ans, cntW);
                    cntB = 0;
                    cntW = 0;

                }
            }

            System.out.println(ans);
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

백준에서 자바로 답안을 제출하는 경우, class 이름은 Main 으로 해야한다.

 

문제에서 요구하는 모든 경우의 수에 대하여 브루트포스 방법으로 답을 구하는 문제였다. 완성된 체스판의 두가지 경우의 수에 대하여 8*8 크기의 체스판의 모든 경우에서 변경되는 칸의 개수를 리스트에 저장하고 최소값을 출력하였다.

 

Comments