https://www.acmicpc.net/problem/1018
๐ ํ์ด 2 : 2์ฐจ์ ๋ฐฐ์ด์ ๋ฌธ์ ๋ฐฐ์ด ์ ์ฅ ํ ์บ๋ฆญํฐ ๋น๊ต (108ms)
- `(i + j)`๊ฐ ์ง์์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์์ ๋น๊ต
import java.io.*;
import java.util.*;
public class Main {
// M×N ํฌ๊ธฐ์ ๋ณด๋๋ฅผ ์๋ผ์ 8x8 ํฌ๊ธฐ์ ์ฒด์คํ์ผ๋ก ๋ง๋ค ๋, ๋ค์ ์น ํด์ผ ํ๋ ์ ์ฌ๊ฐํ์ ์ต์ ๊ฐ์ ์ถ๋ ฅ
public static void main(String[] args) throws IOException {
/* [1] ์
๋ ฅ */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // ํ์ ์
int M = Integer.parseInt(st.nextToken()); // ์ด์ ์
char[][] board = new char[N][M]; // ๋ณด๋ ๋ฐฐ์ด ์์ฑ
for (int i = 0; i < N; i++) {
board[i] = br.readLine().toCharArray(); // ์
๋ ฅ๋ ๋ฌธ์์ด์ ๋ฌธ์ ๋ฐฐ์ด๋ก ๋ณํโญ
}
/* [2] ์ต์๊ฐ ์ฐพ๊ธฐ */
int minCount = Integer.MAX_VALUE; // ์ต์๊ฐ ์ด๊ธฐํ
for (int row = 0; row <= N - 8; row++) {
for (int col = 0; col <= M - 8; col++) {
minCount = Math.min(minCount, getMinChanges(board, row, col)); // ํจ์ ํธ์ถโญ
}
}
System.out.println(minCount); // ๊ฒฐ๊ณผ ์ถ๋ ฅ
}
// 8x8 ์์ญ์์ ๋ค์ ์น ํด์ผ ํ๋ ์ต์ ์ ์ฌ๊ฐํ ๊ฐ์ ๋ฐํ
public static int getMinChanges(char[][] board, int startRow, int startCol) {
int cntW = 0; // ๋ค์ ์น ํด์ผ ํ๋ ๊ฐ์('W'๋ก ์์ํ๋ ๊ฒฝ์ฐ)
int cntB = 0; // ๋ค์ ์น ํด์ผ ํ๋ ๊ฐ์('B'๋ก ์์ํ๋ ๊ฒฝ์ฐ)
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
char current = board[startRow + i][startCol + j];
/* [1] ์ฒด์คํ์ ์ฌ๋ฐ๋ฅธ ์์ ์ด์ง์์ ๋น๊ต('W'๋ก ์์ํ๋ ๊ฒฝ์ฐ) */
char chessColor = ((i + j) % 2 == 0) ? 'W' : 'B'; // ์ฌ๋ฐ๋ฅธ ์์โญ
if (current != chessColor) cntW++;
/* [2] ์ฒด์คํ์ ์ฌ๋ฐ๋ฅธ ์์ ์ด์ง์์ ๋น๊ต('B'๋ก ์์ํ๋ ๊ฒฝ์ฐ) */
chessColor = chessColor == 'W' ? 'B' : 'W'; // ๋ฐ๋
if (current != chessColor) cntB++;
}
}
return Math.min(cntW, cntB); // ๋ ๊ฒฝ์ฐ ์ค ๋ ์ ์ ๋ณ๊ฒฝ ํ์ ๋ฐํโญ
}
}
๐ ํ์ด 1 : 1์ฐจ์ ๋ฐฐ์ด์ ๋ฌธ์์ด ์ ์ฅ ํ ์ด์ง์ ๋นํธ XOR ์ฐ์ฐ (160ms)
- ๋นํธ ์ฐ์ฐ์ ์ด์ฉ
- `^` (XOR, ๋ฐฐํ์ ๋ ผ๋ฆฌํฉ): ๋ ๋นํธ๊ฐ ์๋ก ๋ค๋ฅผ ๋ 1
- `~` (NOT, ๋นํธ ๋ฐ์ ): ๋นํธ์ ๊ฐ ๋ฐ์ . 0์ 1๋ก, 1์ 0์ผ๋ก
- `&` (AND, ๋ ผ๋ฆฌ๊ณฑ): ๋ ๋นํธ๊ฐ ๋ชจ๋ 1์ผ ๋๋ง 1
- `Integer.parseInt(String s, int radix)`, `Integer.bitCount(int i)` ๋ฉ์๋ ใ
import java.io.*;
import java.util.*;
public class Main {
// M×N ํฌ๊ธฐ์ ๋ณด๋๋ฅผ ์๋ผ์ 8x8 ํฌ๊ธฐ์ ์ฒด์คํ์ผ๋ก ๋ง๋ค ๋, ๋ค์ ์น ํด์ผ ํ๋ ์ ์ฌ๊ฐํ์ ์ต์ ๊ฐ์ ์ถ๋ ฅ
public static void main(String[] args) throws IOException {
/* [1] ์
๋ ฅ ๋ฐ ์นํ */
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // ํ์ ์
int M = Integer.parseInt(st.nextToken()); // ์ด์ ์
String[] arr = new String[N]; // 1์ฐจ์ ๋ฐฐ์ด ์์ฑ (๊ฐ ํ ์ ์ฅ)
for (int i = 0; i < N; i++) {
String str = br.readLine(); // ํ ํ์ ๋ฌธ์์ด ์
๋ ฅ (ex. WBWBWBWB)
arr[i] = str.replaceAll("B", "1").replaceAll("W", "0"); // 'B'๋ '1', 'W'๋ '0'์ผ๋ก ์นํํ์ฌ ์ ์ฅโญ
}
/* [2] ์ต์๊ฐ ์ฐพ๊ธฐ */
int cnt = 32; // ์ฒด์คํ์ ๋ค์ ์น ํด์ผ ํ๋ ์ ์ฌ๊ฐํ ๊ฐ์ ์ต๋๊ฐ
for (int row = 0; row <= N - 8; row++) {
for (int col = 0; col <= M - 8; col++) { // 8x8 ํฌ๊ธฐ ์ฒด์คํ ์ ํ ํ, ๋ค์ ์น ํด์ผ ํ๋ ์ต์ ์ ์ฌ๊ฐํ ๊ฐ์ ์ฐพ๊ธฐ
cnt = Math.min(cnt, getMinChanges(arr, row, col)); // ํจ์ ํธ์ถโญ
}
}
System.out.println(cnt);
}
// 8x8 ์์ญ์์ ๋ค์ ์น ํด์ผ ํ๋ ์ต์ ์ ์ฌ๊ฐํ ๊ฐ์ ๋ฐํ
public static int getMinChanges(String[] arr, int startRow, int startCol) {
int cntW = 0; // ๋ค์ ์น ํด์ผ ํ๋ ๊ฐ์('W'๋ก ์์ํ๋ ๊ฒฝ์ฐ)
int cntB = 0; // ๋ค์ ์น ํด์ผ ํ๋ ๊ฐ์('B'๋ก ์์ํ๋ ๊ฒฝ์ฐ)
for (int i = 0; i < 8; i++) {
int current = Integer.parseInt(arr[i + startRow].substring(startCol, startCol + 8), 2);
/* [1] ์ฒด์คํ์ ์ฌ๋ฐ๋ฅธ ์์ ์ด์ง์์ ๋น๊ต('W'๋ก ์์ํ๋ ๊ฒฝ์ฐ) */
int chess = Integer.parseInt((i % 2 == 0) ? "01010101" : "10101010", 2); // ์ฌ๋ฐ๋ฅธ ์์ ์ด์ง์โญ
cntW += Integer.bitCount(chess ^ current); // ๋นํธ XOR ์ฐ์ฐ ๊ฒฐ๊ณผ์์ 1๋ก ๋ํ๋๋ ๋ถ๋ถ์ด ๋ค์ ์น ํด์ผ ํ๋ ๊ฐ์โญ
/* [2] ์ฒด์คํ์ ์ฌ๋ฐ๋ฅธ ์์ ์ด์ง์์ ๋น๊ต('B'๋ก ์์ํ๋ ๊ฒฝ์ฐ) */
chess = ~chess & 0b11111111; // ๋นํธ๋ฅผ ๋ฐ์ ํ๊ณ , 8๋นํธ๋ง ์ ์ง(์ด์ง์ ์์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด 0b ์ ๋์ฌ ์ฌ์ฉ)
cntB += Integer.bitCount(chess ^ current);
}
return Math.min(cntW, cntB); // ๋ ๊ฒฝ์ฐ ์ค ๋ ์ ์ ๋ณ๊ฒฝ ํ์ ๋ฐํโญ
}
}
'๐ท์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/Java] 2164 ์นด๋2(LinkedList) (0) | 2024.08.20 |
---|---|
[๋ฐฑ์ค/Java] 1920 ์ ์ฐพ๊ธฐ(์ด์ง ํ์, Arrays.binarySearch()) (0) | 2024.08.19 |
[๋ฐฑ์ค/Java] 11866 ์์ธํธ์ค ๋ฌธ์ 0(LinkedList, ์ํ ํ) (0) | 2024.08.18 |
[๋ฐฑ์ค/Java] 11651 ์ขํ ์ ๋ ฌํ๊ธฐ 2(Comparator, ๋๋ค์) (0) | 2024.08.18 |