코딩 테스트/백준
[백준 2024/01/24] 1018번 체스판 다시 칠하기
미뿌감
2024. 1. 24. 20:32
728x90
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
1. 접근 방법
이번 문제는 코드를 어떻게 구성해야 할지 고민이 많았던 문제이다.
노트에 쓰고 지우고 쓰고 지우다가 우선 2중 for문을 만들어서, 8*8을 쭉 훑을 수 있는 코드를 작성해보자고 적어보았다.
for(int i=0; i<8; i++){
for(int k = 0; k<8; k++){
if(case1[i][k] != contrast[a+i][b+k]){
f_alse +=1;
}
}
}
그래서 이렇게 for문을 구성해보았고, 입력으로 받아온 보드의 크기에 따라 +a +b를 해주어
모든 경우의 수를 돌아보게 만들어야겠다고 생각했다.
b의 경우 보드의 width 크기가 10일 경우에 0, 1, 2 까지 더해져야 한다.
(a)만약 height가 11일 경우에는, 0, 1, 2, 3 까지 더해져야 한다.
이를 다시 a와 b에 대한 2중 for 문으로 감싸줘야겠다고 생각했다.
for(int b = 0; b<= m-8; b++){
for(int a = 0; a<= n-8; a++){
for(int i=0; i<8; i++){
for(int k = 0; k<8; k++){
if(case1[i][k] != contrast[a+i][b+k]){
f_alse +=1;
}
}
}
if(ff_alse > f_alse){
ff_alse = f_alse;
}
f_alse = 0;
}
}
이렇게 코드를 작성했다. for문이 4개라니...! 가장 먼저 시간 초과가 걱정되기 시작했다.
하지만, 이것 이외에 방법은 생각나지 않았기에 강행하기로 했다.
ff_alse의 변수의 경우 최소 값이 나타날 경우 값은 바꾸도록 만들어 놓았다.
W로 시작하는 보드판의 경우와
B로 시작하는 보드판의 경우 2가지를 모두 나타내주었다.
char[][] case1 = {
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
};
char[][] case2 = {
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
};
뭔가 심리적 안정이 되는듯한 그런 모습이다..ㅎ
+ 뭔가몽가.. 코드가 긴 느낌이다.
짧게 효율적으로 만들 방법이 없을까
2. 코드
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.*;
public class b1018 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
char[][] case1 = {
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
};
char[][] case2 = {
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
{'B','W','B','W','B','W','B','W'},
{'W','B','W','B','W','B','W','B'},
};
String line = reader.readLine();
String[] w_h = line.split("\\s+");
int n = Integer.parseInt(w_h[0]);
int m = Integer.parseInt(w_h[1]);
char[][] contrast = new char[n][m];
for(int i = 0; i<n; i++){
String lin = reader.readLine();
for(int j = 0; j< m; j++){
contrast[i][j] = lin.charAt(j);
}
}
int f_alse = 0;
int ff_alse = 65;
for(int b = 0; b<= m-8; b++){
for(int a = 0; a<= n-8; a++){
for(int i=0; i<8; i++){
for(int k = 0; k<8; k++){
if(case1[i][k] != contrast[a+i][b+k]){
f_alse +=1;
}
}
}
if(ff_alse > f_alse){
ff_alse = f_alse;
}
f_alse = 0;
}
}
f_alse = 0;
for(int b = 0; b<= m-8; b++){
for(int a = 0; a<= n-8; a++){
for(int i=0; i<8; i++){
for(int k = 0; k<8; k++){
if(case2[i][k] != contrast[a+i][b+k]){
f_alse +=1;
}
}
}
if(ff_alse > f_alse){
ff_alse = f_alse;
}
f_alse = 0;
}
}
System.out.println(ff_alse);
}
}
728x90