본문 바로가기
알고리즘/백준

백준 1018번 체스판 다시 칠하기 자바 java

by 클로드 2021. 4. 9.
반응형

문제

풀이

 

입력한 보드와 8 * 8 체스판 2개와 비교

(BWBWBWBW 시작하는 것, WBWBWBWB 시작하는 것)를 해서

최솟값을 출력해서 풀었다

 

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int M = sc.nextInt();
        String[] board = new String[N];

        int min = 64;
        int count;

        sc.nextLine();

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

        //8 * 8 잘라서 최소값 찾기
        for (int i = 0; i < N - 7; i++) {
            for (int j = 0; j < M - 7; j++) {
                count = compareBoard(board, i, j);
                if (min > count) {
                    min = count;
                }
            }
        }

        System.out.println(min);
    }

    public static int compareBoard(String[] board, int x, int y) {
        int count1 = 0;
        int count2 = 0;
        String[] chessBoard1 = {"BWBWBWBW","WBWBWBWB","BWBWBWBW","WBWBWBWB","BWBWBWBW","WBWBWBWB","BWBWBWBW","WBWBWBWB"};
        String[] chessBoard2 = {"WBWBWBWB","BWBWBWBW","WBWBWBWB","BWBWBWBW","WBWBWBWB","BWBWBWBW","WBWBWBWB","BWBWBWBW"};

        for (int i = x; i < x + 8; i++) {
            for (int j = y; j < y + 8; j++) {
                if (board[i].charAt(j) != chessBoard1[i - x].charAt(j - y)) {
                    count1++;
                }
                if (board[i].charAt(j) != chessBoard2[i - x].charAt(j - y)) {
                    count2++;
                }
            }
        }

        if (count1 > count2) {
            return count2;
        }

        return count1;
    }
}

 

문제를 정확하게 이해를 하지 못해서 푸는데 시간이 오래 걸렸다

처음에는 N * M 체스판을 만들어서 비교했다가 실패해서 다시 코드를 짜고

체스판이 2가지 타입인 것을 모르고 보드 입력 값의 첫 번째 값을 체스판으로 만들어서 제출을 했는데 계속 실패를 해서 질문 게시판을 보다가 테스트 케이스를 보고 깨달았다

8 8
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBW

output : 33
answer : 31

 

 

출처

www.acmicpc.net/problem/1018

 

반응형

댓글