Skip to content

Commit 1f49f0f

Browse files
committed
[20250920] BOJ / G4 / 체스판 다시 칠하기 2 / 김민진
1 parent f9bae84 commit 1f49f0f

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
```java
2+
package etc;
3+
4+
import java.io.*;
5+
import java.util.StringTokenizer;
6+
7+
public class BJ_25682_체스판_다시_칠하기_2 {
8+
9+
private static final boolean BLACK = true;
10+
private static final boolean WHITE = false;
11+
12+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
14+
private static StringTokenizer st;
15+
16+
private static int N, M, K;
17+
18+
private static boolean[][] board;
19+
private static int[][] prefix;
20+
21+
public static void main(String[] args) throws IOException {
22+
init();
23+
sol();
24+
}
25+
26+
private static void init() throws IOException {
27+
st = new StringTokenizer(br.readLine());
28+
N = Integer.parseInt(st.nextToken());
29+
M = Integer.parseInt(st.nextToken());
30+
K = Integer.parseInt(st.nextToken());
31+
32+
board = new boolean[N + 1][M + 1];
33+
prefix = new int[N + 1][M + 1];
34+
35+
for (int i = 1; i <= N; i++) {
36+
String s = br.readLine();
37+
for (int j = 1; j <= M; j++) {
38+
board[i][j] = s.charAt(j - 1) == 'B' ? BLACK : WHITE;
39+
}
40+
}
41+
}
42+
43+
private static void sol() throws IOException {
44+
bw.write(Math.min(setPrefix(BLACK), setPrefix(WHITE)) + "\n");
45+
bw.flush();
46+
bw.close();
47+
br.close();
48+
}
49+
50+
// 열 + 행이 짝수일 때 color라고 가정
51+
private static int setPrefix(boolean color) {
52+
int val;
53+
54+
for (int i = 1; i <= N; i++) {
55+
for (int j = 1; j <= M; j++) {
56+
if ((i + j) % 2 == 0) {
57+
val = board[i][j] != color ? 1 : 0;
58+
} else {
59+
val = board[i][j] == color ? 1 : 0;
60+
}
61+
prefix[i][j] = prefix[i][j - 1] + prefix[i - 1][j] - prefix[i - 1][j - 1] + val;
62+
}
63+
}
64+
return getMinPrefix();
65+
}
66+
67+
private static int getMinPrefix() {
68+
int cnt = Integer.MAX_VALUE;
69+
70+
for (int i = K; i <= N; i++) {
71+
for (int j = K; j <= M; j++) {
72+
cnt = Math.min(cnt, prefix[i][j] - prefix[i - K][j] - prefix[i][j - K] + prefix[i - K][j - K]);
73+
}
74+
}
75+
return cnt;
76+
}
77+
78+
}
79+
```

0 commit comments

Comments
 (0)