白準1018チェス盤(JAVA)を塗り直す
2964 ワード
[解法]
まず、8*8チェス盤はBで始まり、Wで始まり、2種類しかないので、事前にチェス盤を2つ作っておきました.
ここで与えられた入力は88より大きいので、88になることができるすべての状況をチェックしました.各地点はあらかじめ作成したチェス盤と比較し,修正すべき数を数え,リストに列挙し,最小値のみ抽出する.
import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static String [][] map;
public static String [][] B;
public static String [][] W;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
int row = sc.nextInt();
int col = sc.nextInt();
sc.nextLine();
map = new String[row][col];
for(int i = 0 ; i < row; i ++) {
String str = sc.next();
for(int j = 0 ; j < col; j++) {
map[i][j] = str.substring(j,j+1);
}
}
B= new String[8][8];
W= new String[8][8];
//미리 두가지 경우의 수를 가지는 8*8짜리 체스판모양 만들어놈
for(int i = 0 ; i < 8 ; i ++) {
for(int j = 0 ; j < 8 ; j++) {
if((i%2 ==0 && j%2 ==0) || (i%2 != 0 && j%2 !=0)) {
B[i][j] = "B";
W[i][j] = "W";
}
else if((i%2 ==0 && j%2 !=0) || (i%2 !=0 && j%2 ==0)) {
B[i][j] = "W";
W[i][j] = "B";
}
}
}
int rowStart = 0;
int colStart = 0;
int cnt = 0;
//시작위치를 rowStart , colStart 지점으로하고 한 사이클돌때마다 이를 초기화해줌
while(colStart+8 <= col) {
for(int i = rowStart ; i < rowStart+8 ; i++)
for(int j = colStart ; j < colStart +8; j++)
cnt = compare(rowStart,colStart); //특정지점마다 cnt 세줌
//cnt를 모두 담고
list.add(cnt);
cnt = 0;
rowStart++;
if(rowStart+8 > row) {
rowStart = 0;
colStart++;
}
}
//최소값만 뽑기
System.out.println(Collections.min(list));
}
//rowStart,colStart 지점에서 8*8모양 map 이랑 미리 만들어둔 배열이랑 비교하고 틀린 갯수 셈
public static int compare(int row , int col) {
int value1 = 0;
int value2 = 0;
int value = 0;
if(map[row][col].equals("B")) {
for(int i = row ; i < row+8 ; i++) {
for(int j = col ; j < col+8 ; j++) {
if(!B[i-row][j-col].equals(map[i][j]))
value1++;
if(!W[i-row][j-col].equals(map[i][j]))
value2++;
}
}
}
else if(map[row][col].equals("W")) {
for(int i = row ; i < row+8 ; i++) {
for(int j = col ; j < col+8 ; j++) {
if(!W[i-row][j-col].equals(map[i][j]))
value1++;
if(!B[i-row][j-col].equals(map[i][j]))
value2++;
}
}
}
value = Math.min(value1, value2);
return value;
}
}
Reference
この問題について(白準1018チェス盤(JAVA)を塗り直す), 我々は、より多くの情報をここで見つけました https://velog.io/@alstjdwo1601/백준-1018번-체스판-다시-칠하기JAVAテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol