문제 핵심 포인트
1. 문제 단계 제목인 브루트 포스 알고리즘
순서
1. 전체 보드 입력
2. 전체 보드에서 부분보드(8x8)를 전체 탐색
3. check함수 = 부분보드를 인자로 받아서 일반체스판과 일치하는 사각형이 얼마나 있는지 확인하는 함수
4. 모든 부분보드를 반복문을 돌면서 check함수에 인자로 전달
5. 반환값들 중에 가장 큰 반환값을 이용해서 정답 출력
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int check(char[][] subBoard){
int countW=0;
int countB=0;
String[] W = new String[8];
String[] B = new String[8];
//비교용 보드
String w = "WBWBWBWB";
String b = "BWBWBWBW";
for (int i=0;i<8;i++){
if(i%2==0){
W[i]=w;
B[i]=b;
}
else {
W[i] = b;
B[i] = w;
}
}
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
if(subBoard[i][j]==W[i].charAt(j))countW++;
if(subBoard[i][j]==B[i].charAt(j))countB++;
}
}
if(countW<countB)
return countB;
else
return countW;
}
static char[][] makeSubBoard(String[] Board,int startI,int startJ){
char[][] result = new char[8][8];
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
result[i][j] = Board[startI+i].charAt(startJ+j);
}
}
return result;
}
public static void main(String[] length) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
String[] Board = new String[n];
char[][] subBoard = new char[8][8];
//입력받은 보드
for (int i = 0;i<n;i++){
Board[i]=br.readLine();
}
int max = 0;
//부분보드 돌려보기
for (int i=0;i<=n-8;i++){
for (int j=0;j<=m-8;j++){
subBoard = makeSubBoard(Board,i,j);
if(max<=check(subBoard)){
max=check(subBoard);
}
}
}
bw.write(Integer.toString(64-max));
bw.flush();
bw.close();
br.close();
}
}
'백준' 카테고리의 다른 글
백준 2420 - 사파리 월드 - Java (0) | 2024.08.27 |
---|---|
백준 2839번 - 설탕배달 문제 - Java (0) | 2023.07.17 |
백준 24313번 - BigO표기법 문제설명 - Java (0) | 2023.07.12 |
백준 24264 -Java (0) | 2023.07.09 |
백준 10757 - Java (0) | 2023.07.08 |
문제 핵심 포인트
1. 문제 단계 제목인 브루트 포스 알고리즘
순서
1. 전체 보드 입력
2. 전체 보드에서 부분보드(8x8)를 전체 탐색
3. check함수 = 부분보드를 인자로 받아서 일반체스판과 일치하는 사각형이 얼마나 있는지 확인하는 함수
4. 모든 부분보드를 반복문을 돌면서 check함수에 인자로 전달
5. 반환값들 중에 가장 큰 반환값을 이용해서 정답 출력
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int check(char[][] subBoard){
int countW=0;
int countB=0;
String[] W = new String[8];
String[] B = new String[8];
//비교용 보드
String w = "WBWBWBWB";
String b = "BWBWBWBW";
for (int i=0;i<8;i++){
if(i%2==0){
W[i]=w;
B[i]=b;
}
else {
W[i] = b;
B[i] = w;
}
}
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
if(subBoard[i][j]==W[i].charAt(j))countW++;
if(subBoard[i][j]==B[i].charAt(j))countB++;
}
}
if(countW<countB)
return countB;
else
return countW;
}
static char[][] makeSubBoard(String[] Board,int startI,int startJ){
char[][] result = new char[8][8];
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
result[i][j] = Board[startI+i].charAt(startJ+j);
}
}
return result;
}
public static void main(String[] length) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
String[] Board = new String[n];
char[][] subBoard = new char[8][8];
//입력받은 보드
for (int i = 0;i<n;i++){
Board[i]=br.readLine();
}
int max = 0;
//부분보드 돌려보기
for (int i=0;i<=n-8;i++){
for (int j=0;j<=m-8;j++){
subBoard = makeSubBoard(Board,i,j);
if(max<=check(subBoard)){
max=check(subBoard);
}
}
}
bw.write(Integer.toString(64-max));
bw.flush();
bw.close();
br.close();
}
}
'백준' 카테고리의 다른 글
백준 2420 - 사파리 월드 - Java (0) | 2024.08.27 |
---|---|
백준 2839번 - 설탕배달 문제 - Java (0) | 2023.07.17 |
백준 24313번 - BigO표기법 문제설명 - Java (0) | 2023.07.12 |
백준 24264 -Java (0) | 2023.07.09 |
백준 10757 - Java (0) | 2023.07.08 |