




문제는 이해가 갔는데, 풀려니까 막상 난감했다. 처음에는 상하좌우 값을 대조하는 쪽으로 가려고 했는데, 그러면 바깥 테두리 부분에 있는 문자들을 비교하기가 힘들었다. 결국 정답을 보려고 했는데, 거기서 얻은 힌트들로 갑자기 아이디어가 떠올라 풀 수 있었다. 어쩌다보니 오중구문이 되버림...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String xy = br.readLine();
StringTokenizer st = new StringTokenizer(xy);
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
boolean wb[][] = new boolean[x][y]; // 입력값을 받을 배열
int count[] = new int[2];
// 다시 칠할 횟수를 판단할 배열, 첫수가 W일때, B일때 각각 나눔.
int min = 64;
// 갱신할 최솟값
for (int i=0; i<x; i++) {
String str = br.readLine();
for (int j=0; j<y; j++) {
if (str.charAt(j) == 'W') {
wb[i][j] = true;
} else {
wb[i][j] = false;
}
}
} // 배열에 입력값 채워넣기
for (int m=0; m<x-7; m++) { // 셈을 처음 시작할 8*8정사각형의 왼쪽 상단 꼭지점의 x좌표.
for (int l=0; l<y-7; l++) { // 셈을 처음 시작할 8*8정사각형의 왼쪽 상단 꼭지점의 y좌표.
for (int k=0; k<2; k++) { // k=0일땐 왼쪽 상단은 W, k=1일때 왼쪽 상단은 B.
for (int i=m; i<m+8; i++) { // 8*8정사각형의 왼쪽 상단부터 가로 8칸을 비교.
for (int j=l; j<l+8; j++) { //8*8정사각형의 왼쪽 상단부터 세로 총 8칸을 비교.
if (k==0) {
if ((i+j)%2==0 && wb[i][j]==false) {
count[k]++;
} else if ((i+j)%2==1 && wb[i][j]==true) {
count[k]++;
}
} else {
if ((i+j)%2==0 && wb[i][j]==true) {
count[k]++;
} else if ((i+j)%2==1 && wb[i][j]==false) {
count[k]++;
}
}
}
}
if (count[k] < min) {
min = count[k]; // 최소값이 갱신되면 바꿔준다.
}
count[0] = 0;
count[1] = 0;
// 재활용을 위한 count값들 초기화.
}
}
}
System.out.println(min);
}
}'백준 문제풀이' 카테고리의 다른 글
| 10815. 숫자 카드 (자바, Java) (0) | 2022.10.03 |
|---|---|
| 1436. 영화감독 숌 (자바, Java) (0) | 2022.10.02 |
| 7568. 덩치 (자바, Java) (0) | 2022.10.02 |
| 2231. 분해합 (자바, Java) (0) | 2022.10.02 |
| 2798. 블랙잭 (자바, Java) (0) | 2022.10.02 |