미소를뿌리는감자의 코딩
[백준 2024/01/24] 1018번 체스판 다시 칠하기 본문
728x90
https://www.acmicpc.net/problem/1018
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
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2024/01/25] 2164번 카드2 (0) | 2024.01.26 |
---|---|
[백준 2024/01/24] 1920번 수 찾기 (2) | 2024.01.24 |
[백준 2024/01/23] 12865번 평범한 배낭 (2) | 2024.01.23 |
[백준 2024/01/22] 1003번 피보나치 함수 (0) | 2024.01.22 |
[백준 2024/01/22] 1010번 다리 놓기 (0) | 2024.01.22 |