ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 1018 체스판 다시 칠하기
    ALGORITHM/BOJ 2022. 6. 19. 13:34

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

     

    1018번: 체스판 다시 칠하기

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

    www.acmicpc.net

    2022-06-19


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.util.Scanner;
     
    public class Main1018 {
        public static int N, M;
        public static char[][] arr;
        public static int solve(int sx, int sy) {
           char val = arr[sx][sy];
           int count = 0;
           boolean flag = false;
           for(int i = sx; i < sx+8; i++) {
               for(int j = sy; j < sy+8; j++) {
                   if(arr[i][j] != val) count++;
                   val = val == 'W' ? 'B' : 'W';
               }
               val = val == 'W' ? 'B' : 'W';
           }
           return Math.min(count, (64-count));
        }
     
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            N = sc.nextInt();
            M = sc.nextInt();
     
            arr = new char[N][M];
            int answer = Integer.MAX_VALUE;
     
            for(int i = 0; i < N; i++) {
                String str = sc.next();
                for(int j = 0; j < M; j++) {
                    arr[i][j] = str.charAt(j);
                }
            }
            for(int i = 0; i <= N-8; i++) {
                for(int j = 0; j <= M-8; j++) {
                    answer = Math.min(answer, solve(i, j));
                }
            }
            System.out.println(answer);
        }
    }
    cs

    # 문제풀이

     

    체스판에서 8x8씩 떼어서 시작을 W / B로 했을 때, 다시 칠해야하는 체스판의 수를 계산하면 된다. 

     

    1) 0 ~ (N-8), 0 ~ (M-8)까지 8x8이 되는 모든 경우의 수를 체크한다.

    N-8, M-8을 한 이유는 길이가 8x8인 체스판이기 때문이다. 예를 들어 N이 10, M이 13면 N은 0, 1, 2까지 출발지점을 잡을 수 있고, M은 0, 1,2 ,3 ,4, 5에서 시작할 수 있다.

     

    즉, (N-7)*(M-7) 만큼의 경우의 수를 계산한다. 

     

    2) solve(sx, xy) 값을 넘겨서 예를 들어 B로 시작했으면 첫째줄은 BWBWBWBW, 그 다음줄은 WBWBWBWB 로 반복하면서 현재 칠해진 값이랑 비교를 했다. 다음 값을 넘어갈때마다 기준 값의 반대값 (B <-> W)으로 만들면서 비교했다. 

     

    다음 줄로 아예 넘어갈 때는 시작점이 달라져서 한 번 더 반대값으로 바꾸고 비교했다. 

     

    3) 처음 시작이 예를 들어 B였다면, B로 시작했을 때 칠해야하는 체스판의 수를 64(8x8)개에서 빼준 수와 B로 시작했을 때 칠해야하는 수 중 더 작은 값을 return 했다. 64 - B로 시작했을때 칠해야하는 체스판의 수는 W로 시작했을 때의 경우의 수와 같다.

     

    그래서 결국엔 1)번 경우의 수에 (N-7)*(M-7) *2 를 한 경우가 최종 경우의 수가 된다.

     

    'ALGORITHM > BOJ' 카테고리의 다른 글

    [BOJ] 1916 최소비용 구하기  (0) 2022.06.19
    [BOJ] 1753 최단경로  (0) 2022.06.19
    [백준] 10799 쇠막대기  (0) 2022.05.08
    [백준] 1193 분수찾기  (0) 2022.02.06
    [백준] 1339 단어 수학  (0) 2022.02.05

    댓글

Programming Diary