728x90
반응형
안녕하세요 놀이방 사장입니다.
이번 포스팅은 백준 1018
체스판 다시 칠하기 포스팅입니다.
완전 탐색, 브루트포스 문제입니다.
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
이 문제는 N, M이 주어지면 이 체스판에서 8*8로 밑에 사진처럼 만들어주면 됩니다. WBWB 이런식으로 해도 무방합니다.
8 8 이 넘을경우 특정 부분을 떼서 최소의 수로 저렇게 만들어주면 됩니다.
package me.joyeonggyu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main{
public static boolean[][] arr;
public static int min = 64;
public static void main(String args[]) throws IOException {
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());
arr = new boolean[N][M];
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < M; j++) {
if (str.charAt(j) == 'W') {
arr[i][j] = true;
} else {
arr[i][j] = false;
}
}
}
int max_N = N - 7;
int max_M = M - 7;
for(int i=0; i<max_N; i++){
for(int j=0; j<max_M; j++){
find(i,j);
}
}
System.out.println(min);
}
public static void find(int x, int y){
int count = 0;
boolean TF = arr[x][y];
for(int i=x; i<x+8; i++){
for(int j=y; j<y+8; j++){
if(arr[i][j] != TF){
count++;
}
TF = !TF;
}
TF = !TF;
}
count = Math.min(count, 64-count);
min = Math.min(min,count);
}
}
find전 부분은 arr배열에 문자들을 담는 작업을 하는 것입니다.
max_N, max_N은 N,M체스판에서 뗄 수 있는 부분을 말하는 거에요
그리고 find에서 TF 변수를 통해 문자를 바꿔야하는 지 구분하는 거에요
그리고 count = Math.min(count, 64-count)
부분은 처음에 B로 시작하는 경우의 수랑 W로 시작하는 경우에 수중 뭐가 더 적은 지 찾는 부분입니다.
풀기가 어려우시다면 참조해서 푸시면 좋을 거 같습니다.!
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준1010번 다리 놓기 - JAVA (1) | 2023.12.29 |
---|---|
백준[1032] 명령 프롬프트 - JAVA (0) | 2023.12.28 |
[백준]1340 - 연도 진행바 - JAVA (0) | 2023.12.05 |
[백준]1312 - 소수 - JAVA (1) | 2023.12.04 |
백준 1308 D-day 자바 풀이 (0) | 2023.12.03 |