코딩테스트/백준
[백준-자바] 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