728x90
오답 노트 & 새로 알게 된 점
이 문제는 규칙성이 중요하다.
제일 처음 시작한 문자가 B일 경우와 W일 경우 아래와 같은 규칙이 나타난다.
홀수 + 홀수 = 짝수
홀수 + 짝수 = 홀수
짝수 + 짝수 = 짝수
처음 시작 문자가 B일 때 생각해보자.
홀수일 경우에는 W가 와야하고, 짝수일 경우에 B가 와야한다.
그래서 i+j가 홀수인데 W가 아니면 cnt를 늘리고, i+j가 짝수인데 B가 아니면 cnt를 늘린다.
이 때, 처음 시작 문자가 W일 때와 반대이기 때문에
64 - cnt를 하면 W일 때를 구할 수 있다.
그래서 cnt와 64-cnt 중 최소값을 리턴하면 된다.
그리고 모든 행과 열을 탐색하면서 최솟값을 찾으면 된다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package BruteForce_Search;
import java.io.*;
import java.util.*;
public class Main {
static int atoi(String str) {
return Integer.parseInt(str);
}
static int N, M, ans = 64;
static char A[][];
public static void main(String[] args) throws IOException {
input();
pro();
}
static void pro() {
for (int i = 1; i + 7 <= N; i++) {
for (int j = 1; j + 7 <= M; j++) {
ans = Math.min(ans, search(i, j));
}
}
System.out.println(ans);
}
static int search(int x, int y) {
int cnt = 0;
for (int i = x; i <= x + 7; i++) {
for (int j = y; j <= y + 7; j++) {
if ((i + j) % 2 == 0 && A[i][j] != 'B') {
cnt++;
}
if((i+j) % 2 == 1 && A[i][j] != 'W'){
cnt++;
}
}
}
return Math.min(cnt, 64-cnt);
}
static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = atoi(st.nextToken());
M = atoi(st.nextToken());
A = new char[N + 1][M + 1];
for (int i = 1; i <= N; i++) {
String s = br.readLine();
for (int j = 1; j <= M; j++) {
A[i][j] = s.charAt(j - 1);
}
}
}
}
|
cs |
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 3055 탈출 (0) | 2021.10.28 |
---|---|
자바(백준) 1600 말이 되고픈 원숭이 (0) | 2021.10.27 |
자바(백준) 1120 문자열 (0) | 2021.10.21 |
자바(백준) 14891 톱니바퀴 (0) | 2021.10.18 |
자바(백준) 15970 화살표 그리기 (0) | 2021.10.17 |