jacketList

1018 체스판 다시 칠하기 본문

알고리즘/백준

1018 체스판 다시 칠하기

ukkkk7 2023. 11. 14. 13:10
728x90
반응형

 

 

 

 

문제: 지민이가 찾은 M*N의 체스판을 8*8의 형태인 판으로 잘라서 체스판을 만든다고 한다. 체스판이기 때문에 흰칸과 검은칸이 번갈아서 칠해져 있어야 하고 8*8의 크기는 M*N안에서 어느 곳이든 크기가 맞다면 자를 수 있다.

 

 

해설

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
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 m = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        arr = new boolean[m][n];


        for(int i=0; i<m; i++){
			//한줄을 미리 다 입력받기
            String str = br.readLine();
			
            for(int j=0; j<n; j++){
				//한글자씩 검사하는 조건식 W일땐 ture B일땐 false로 저장
                if(str.charAt(j) == 'W'){
                    arr[i][j] = true;
                } else {
                    arr[i][j] = false;
                }

            }
        }

		경우의 수를 구하기 위한 변수 설정
        int m_row = m-7;
        int n_col = n-7;

		//전체 경우의 수에 해당하는 체스판을 확인하는 이중for문
        for(int i=0; i<m_row; i++){
            for(int j=0; j<n_col; j++){
				//잘못된 색이 칠해져 있을 때 count를 해주는 메소드 생성
                find(i, j);
            }
        }

        System.out.println(min);

    }


	
    public static void find(int x, int y){
		//8*8이 고정적인 체스판의 크기이므로 매개변수에 +8을 해준 변수 선언
        int end_x = x+8;
        int end_y = y+8;
        int count = 0;

		//첫 번째 칸의 색을 tf변수에 저장한다.
        boolean tf = arr[x][y];
		
        for(int i=x; i<end_x; i++){
            for(int j=y; j<end_y; j++){
				//만일 tf와 저장해 놓은 해당 배열의 색이 틀리다면 잘못 칠해진 색 이므로 count를 증가시킨다. 
                if(arr[i][j] != tf){
                    count++;

                }
                //한 칸의 j를 검사했으면 다음 칸의 j를 검사해야 하기 때문에 다음 칸의 j를 검사하기 위해 기존 tf의 색을 다른 색으로 바꿔준다.
                    tf = !tf;
         	 }
             // 한 행의 검사를 끝마쳤으면 다음 행의 첫 번째 칸을 검사하기 위해선 다시 색을 바꿔줘야 한다.
             // ※헷갈리지 말것! j=0 다음부터 색을 바꿔주는게 아니라 처음부터 색을 바꿔줌!
             // ex)처음 칸이 W라고 한다면, j = 0 : W->B 
             							 j = 1 : B->W
										 j = 2 : W->B
										 j = 3 : B->W
                                         
                                        
            tf = !tf;
        }
		
        //8*8은 총64칸이고 최솟값을 찾아야 한다
        //ex) 만일 arr[0][0] 한칸만 잘못칠해져 있다면 63개가 아닌 1이 최솟값
        count = Math.min(count, 64-count);
		//이전까지 최솟값 보다 count가 더 작을 경우 다시 한번 최솟값을 갱신해준다.
        min = Math.min(min, count);

    }


}

 

 

728x90
반응형

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

백준:9251 - LCS(Longest Common Subsequence, 최장 공통 부분 수열)  (0) 2024.04.17
11399 ATM  (0) 2023.11.14
진법변환2 11005  (0) 2023.10.25
진법 변환 2745번  (1) 2023.10.24
10809 알파벳 찾기  (0) 2023.09.28