코딩테스트/백준

[백준-자바] 1018번 체스판 다시 칠하기 / 2022.02.09

강원대목동녀 2022. 2. 9. 11:09
728x90

 

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

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
	// 다시 칠해야 하는 정사각형 개수 구하는 메소드
	public static int reTouch(char[][] chess) {   
		String str1 = "BWBWBWBW";
		String str2 = "WBWBWBWB";
		// 맨 왼쪽 위가 'B'이거나 'w'일 때를 비교하기 위해
		// 변수 두 개 선언
		int count1 = 0;
		int count2 = 0; 
		
		for(int i=0; i<8; i+=2) { // 짝수 행
			for(int j=0; j<8; j++) {
				if(chess[i][j] != str1.charAt(j)) // 맨 왼쪽 위가 'B'일 경우
					count1++;                     // count1 + 1
				if(chess[i][j] != str2.charAt(j)) // 맨 왼쪽 위가 'W'일 경우
					count2++;                     // count2 + 1
			}
		}
		for(int i=1; i<8; i+=2) { // 홀수 행
			for(int j=0; j<8; j++) {
				if(chess[i][j] != str2.charAt(j))
					count1++;
				if(chess[i][j] != str1.charAt(j))
					count2++;
			}
		}
	
		return count1>count2?count2:count1; // 칠해야 할 수가 더 적은것을 리턴
	}
	
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        int M = sc.nextInt();   // 크기 입력
        char [][] chess = new char [N][M]; // 입력받은 크기의 체스판 생성
        ArrayList<Integer> mini = new ArrayList<>(); 
        // 8x8로 자른 체스판 중에 다시 칠한 정사각형의 수가 가장 적은 것을 구하기 위해 선언
        
        // 체스판생성
        for(int i=0; i<N; i++) {
        	String color = sc.next();
        	for(int j=0; j<M; j++) {
        		chess[i][j] = color.charAt(j);
        	}
        }
        
        // 체스판을 8x8로 자르고 다시 칠한 정사각형의 개수를 구하는 과정
        for(int i=0; i<=N-8; i++) {
        	for(int j=0; j<=M-8; j++) { // 8x8로 자를 수 있는 맨 왼쪽 위 칸의 범위
        		char [][] min = new char [8][8];
        		for(int h=i, a=0; h<i+8; h++, a++) { // 새로운 8x8 체스판 생성 (min)
        			for(int k=j,b=0; k<j+8; k++,b++) {
        				min[a][b] = chess[h][k]; 
        			}
        		}
        		// min 체스판을 메소드로 넘겨주어 다시 칠해야되는 수를 리턴 받은 후,
        		//arraylist mini에 add
				mini.add(reTouch(min)); 
        	}
        }
        // 다시 칠한 정사각형의 개수들을 오름차순으로 정렬
        Collections.sort(mini);
        System.out.println(mini.get(0)); // 0번이 가장 작은 수
    }
}

 

풀이 : 

 

 

 

728x90